3 無重複字元的最長子串

2021-09-25 17:32:22 字數 2262 閱讀 1248

每日leetcode(27)

無重複字元的最長子串,題目如下:

『』』給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。

示例 1:

輸入: 「abcabcbb」

輸出: 3

解釋: 因為無重複字元的最長子串是 「abc」,所以其長度為 3。

示例 2:

輸入: 「bbbbb」

輸出: 1

解釋: 因為無重複字元的最長子串是 「b」,所以其長度為 1。

示例 3:

輸入: 「pwwkew」

輸出: 3

解釋: 因為無重複字元的最長子串是 「wke」,所以其長度為 3。

請注意,你的答案必須是 子串 的長度,「pwke」 是乙個子串行,不是子串。

『』』這道題最初的想法是遍歷迴圈,暴力演算法,無奈超時,在下面也貼上超時**吧,大概就是判斷下乙個字元是否在當前字串,不在則右移,在的話就找到該元素第乙個元素,在其之後乙個元素位置重新開始判斷

class

solution

:def

lenthoflongestsubstring

(self,s)

:for i in

range

(len

(s)-1)

:if s[i+1]

in s[

:i+1]:

p=s.index(s[i+1]

)if i+

11-p+1:

return self.lenthoflongestsubstring(s[p+1:

])if self.lenthoflongestsubstring(s[p+1:

])>i+

1else i+

1else

:return self.lenthoflongestsubstring(s[i+1:

])if self.lenthoflongestsubstring(s[i+1:

])>i+

1else i+

1return

len(s)

class

solution

:def

lengthoflongestsubstring

(self, s:

str)

->

int:

a=start,end=0,

0 ans=

0 max=

0for i in

range

(len

(s))

:if s[i]

in a.keys():

start=

max(a[s[i]

],start)

a[s[i]

]=i+

1 ans=

max(end-start+

1,ans)

end+=

1return ans

但是呢,這個時間效率其實很不是很好

看到題解裡有個老哥的演算法效率上有了優化,提高了20ms

class

solution

:def

lengthoflongestsubstring

(self, s:

str)

->

int:

if s =='':

return

0 window =

set(

) left =

0 max_len =

0 cur_len =

0for ch in s:

cur_len +=

1while ch in window:

# 從前向後刪除,直到刪除了ch

window.remove(s[left]

) left +=

1 cur_len -=

1if cur_len > max_len:

max_len = cur_len

window.add(ch)

return max_len1

這是優化的滑窗演算法,先碼

3 無重複字元的最長子串

給定乙個字串,找出不含有重複字元的最長子串的長度。示例 給定 abcabcbb 沒有重複字元的最長子串是 abc 那麼長度就是3。給定 bbbbb 最長的子串就是 b 長度是1。給定 pwwkew 最長子串是 wke 長度是3。請注意答案必須是乙個子串,pwke 是 子串行 而不是子串。思路 用 i...

3 無重複字元的最長子串

給定乙個字串,找出不含有重複字元的最長子串的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 無重複字元的最長子串是 abc 其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 無重複字元的最長子串是 b 其長度為 1。示例 3 輸入 pwwkew 輸出 3 解釋 無重複字元的最長子串是...

3 無重複字元的最長子串

給定乙個字串,請你找出其中不含有重複字元的最長子串的長度。示例 1 輸入 abcabcbb 輸出 3解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwkew 輸出 3解釋 因為...