請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。假設字串中只包含從』a』到』z』的字元。例如,在字串中」arabcacfr」,最長非重複子字串為」acfr」,長度為4。暴力,o(n²) o(n)
分析:維持乙個記憶空間,記錄不重複時的最大長度,然後依次加入新字元,如果加入的字元重複了則清空記憶空間重頭開始。
滑動視窗,o(n),o(n) 【人的自然想法】
動態規劃
狀態表示:本題 dp[i] 表示以第 i 個元素結尾的不含重複字元的最大子串長度;
狀態轉移方程:如果第 i 個元素,在前 i-1 個元素中未出現,我們可以直接將第 i個元素加入到上乙個最大子串中, 此時 dp[i] = dp[i-1]+1;如果第 i 個元素,在前 i-1個元素中已出現,那麼我們需要計算,在前 i-1 個元素中,最近一次出現第 i 個元素的位置,並計算出二者的間距distance。如果 distance>dp[i-1],說明重複的元素不影響當前不含重複字元的最大子串長度,所以 dp[i] = dp[i-1]+1,如果distance≤dp[i-1],說明以第 i 位 元素結尾的,最大無重複字元的子串,是從上乙個重複元素的下一位開始,到當前第 i 位元素結束,此時dp[i] = distance.
class solution(object):
def lengthoflongestsubstring(self, s):
""":type s: str
:rtype: int
"""if not s:
return 0
res = 0
p1 = p2 = 0
while p1<=p2 and p2res:
res = count
p1 +=1
return res
class solution(object):
def lengthoflongestsubstring(self, s):
""":type s: str
:rtype: int
"""if not s:
return 0
s = list(s)
d =
res = 0
for one in s:
if one not in d:
res=max(res,len(d))
else:
i = d.index(one)
d[:]=d[i+1:]
return res
def longestsubstringwithoutduplication(s):
if not s:
return 0
dp = [0] * len(s) #dp[i]表示以第i個元素結尾的不含重複字元的最大子串長度
d = dict() # 用來記錄26個字母,上一次出現的位置
res = 0
for i in range(0,len(s)):
if s[i] not in d.keys(): # 第i個元素在之前未出現
dp[i] = dp[i-1]+1
else:
distance = i - d[s[i]]
if distance > dp[i-1]:
dp[i] = dp[i-1]+1
else:
dp[i] = distance
d[s[i]] = i # 更新第i個元素最後出現的位置
res = max(res,dp[i])
return res
最長不含重複字元的子字串
題目 輸入乙個字串,找出字串中最長的不含重複字元的子字串,計算該子字串的長度。假設字串中的字元為 a z 例如 arabcacfr 最長的字串為 rabc 和 acfr 長度為 4 int find max len string str else dp str i a i return max le...
最長不含重複字元的子字串
題目 請從字串中找出乙個最長的不包含重複字元的子 字串,計算該最長子字串的長度。假設字串中只包 含 a z 的字元。例如,在字串 arabcacfr 中,最長的不含重複字元 的子字串是 acfr 長度為 4。分析 f i 表示第i個字元為結尾的不包含重複字元的子字串的最大長度。如果第i個字元之前沒有...
最長不含重複字元的子字串
給定乙個字串,請你找出其中不含有重複字元的最長子串的長度。示例 1 示例 2 示例 3 設定乙個大小為128的陣列記錄字元的下標,子字串的長度為j i 1。變數res記錄當前最長不含重複字元的子字串,變數j指向當前遍歷的字元,如果j指向的字元重複出現,變數i更新為j 1,這樣後面計算子字串長度的時候...