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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章