leetcode 求最長無重複子串

2021-08-25 11:26:02 字數 1148 閱讀 5311

1.求最長無重複子串:

給定乙個字串,找出不含有重複字元的最長子串的長度。

示例:給定 「abcabcbb」 ,沒有重複字元的最長子串是 「abc」 ,那麼長度就是3。

給定 「bbbbb」 ,最長的子串就是 「b」 ,長度是1。

給定 「pwwkew」 ,最長子串是 「wke」 ,長度是3。請注意答案必須是乙個子串,」pwke」 是 子串行 而不是子串。

思路:我們當然可以遍歷,窮舉出所有的子串,然後找出那些沒有重複字元的子串,只要兩個指標就好,表示子串的頭尾部分,然後求出符合要求的子串的最大長度,這樣的時間複雜度,應該是0(n^4),因為首先需要找到所有的子串,0(n^2),之後對於每個子串,需要再次遍歷是否重複,又是0(n^2)。

我們需要找到每新來乙個字元,就以這個字元結尾所能找到的最長子串!

換乙個思路,我們用字典儲存字串和它對應的下標,當新來乙個字元在字典裡面,並且當前字元的下標小於等於最近重複字元所在的位置,這樣的情況下,我們需要更新當前長度的其實位置,其實位置應該位於最近重複位置的下乙個位置,舉例來說,對於字串abcda來說,開始遍歷abcd時,最大長度和當前長度都是4,字典儲存了abcd,以及對應的位置,再來乙個字串a(abcda),此時,a在字典中,a所在的位置大於等於start的位置(start的位置一直是0,還沒更新,從最初的a到d)。這時候start的位置應該更新為最近重複字元(就是第乙個a)的位置,所以這時候start=0+1,也就是當前字串(就是以最近進來的a作為最後乙個字元的子串),它的長度更新為(4-1+1)=4,其實就是bcda,為當前子串作為結尾的最長子串。然後和之前儲存的子串長度做比較。

答案:class solution:

def lengthoflongestsubstring(self, s):

max_len=0

now_len=0

start=0

temp_dic={}

for i in range(len(s)):

if s[i] in temp_dic and temp_dic[s[i]]>=start:

start=temp_dic[s[i]]+1

now_len=i-start+1

temp_dic[s[i]]=i

max_len=max(now_len,max_len)

return max_len

最長無重複子串

examples given abcabcbb the answer is abc which the length is 3.given bbbbb the answer is b with the length of 1.given pwwkew the answer is wke with t...

最長無重複子串

給定乙個字串,請找出其中無重複字元的最長子字串。例如,在 abcabcbb 中,最長無重複子串為 abc 其長度為3。在 pwwkew 最長無重複子串為 wke 其長度為3。注意是是子串,pwke 是子串行而不是子串。leetcode 首先試了試暴力搜尋,遍歷一次字串,遍歷過程中,對每個字元都有乙個...

最長無重複子串

最長無重複子串 兩種思路 一種是暴力解法 一種是動態規劃 package merchant public class maxnorepeat int record 0,maxlen 1,index 0 for int i 1 ilength i else len if maxlenreturn s....