最長不含重複字元的子字串

2021-09-26 10:27:51 字數 1814 閱讀 1948

請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。假設字串中只包含從』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,這樣後面計算子字串長度的時候...