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