Leetcode 930:和相同的二元子数组

1、在由若干 0 和 1 组成的数组 A 中,有多少个和为 S 的非空子数组。

输入:A = [1,0,1,0,1], S = 2
输出:4
解释:
如下面所示,有 4 个满足题目要求的子数组:
[1,0,1,0,1]
[1,0,1,0,1]
[1,0,1,0,1]
[1,0,1,0,1]

      这个问题和之前的Leetcode 560:和为K的数组(最详细的解法!!!)非常类似。

     可以通过Prefix sum前缀和来求解。假设我们令P[i] = A[0] + A[1] + ... + A[i-1]和P[j] = A[0] + A[1] + ... + A[j-1],那么P[j] - P[i] = A[i] + A[i+1] + ... + A[j-1]。如果P[j] - P[i] == S的话,那么[i,j]就是我们需要的区间。所以我们对于每个j,我们只要计算有多少个i使得P[j] - P[i] == S,这样我们就得到了以P[j]作为右区间并且和为S的区间数。对于A中的每个元素都做同样的处理,最有将所有的结果相加即可。

     具体实现上,我们通过hash_map记录P[j]。初始化的时候要注意一个细节,对于dict[0]=1。为什么?因为当P[j]==S时,P[i]=0并且此时我们的result=1。

class Solution:
    def numSubarraysWithSum(self, A, S):
        """
        :type A: List[int]
        :type S: int
        :rtype: int
        """
        result, cur_sum = 0, 0
        sum_dict = {0:1}
        for num in A:
            cur_sum += num
            if cur_sum - S in sum_dict:
                result += sum_dict[cur_sum - S]
            if cur_sum in sum_dict:
                sum_dict[cur_sum] += 1
            else:
                sum_dict[cur_sum] = 1
                
        return result

from:https://blog.csdn.net/qq_17550379/article/details/83547444

2、给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

1、暴力搜索:

class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """     
        maxlen=0 
        for i in range(len(s)):
            temp=''
            for j in range(i+1,len(s)):
                temp+=s[j]
                if(temp==temp[::-1]):
                    if len(temp)>maxlen:
                        maxlen=len(temp)
                        tem=temp
        return tem

2、从最长字符串开始判别,这里的每一次循环其实是定义了不同的字符串长度

class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        n = len(s)
        for i in range(n):
            start = 0
            end = n - i
            while end <= n:
                sub_string = s[start:end]
                if sub_string == sub_string[::-1]:
                    return sub_string
                start += 1
                end += 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值