leetCode 無重複字元的最長子串

2021-08-20 21:17:16 字數 1656 閱讀 6564

題目描述:

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

示例:

給定"abcabcbb",沒有重複字元的最長子串是"abc",那麼長度就是3。

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

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

解題思路:

1.暴力法

逐個遍歷檢查s的所有子字串,判斷是否含有重複的字元.

class solution(object):

def lengthoflongestsubstring(self, s):

""":type s: str

:rtype: int

"""res=0

for i in range(len(s)):         #i從0到n-1

for j in range(i+1,len(s)+1):    #j從i+1到n,雙重迴圈巢狀,列舉出s的所有子字串.

st=s[i:j]

if self.allunique(st):

res=max(res,j-i)

return res

def allunique(self,st):    #判斷乙個字串中是否有重複字元

l=for ch in st:

if ch not in l:

else:

return false

return true

暴力法時間複雜度為o(n^3),最後顯示超出時間限制.

2.滑動視窗:

滑動視窗[i,j)可以將兩個邊界向某一方向滑動,當s[j]不在s[i,j)中時,向右側滑動索引j;當s[j]在s[i,j)中時,i向右滑動.

class solution(object):

def lengthoflongestsubstring(self, s):

""":type s: str

:rtype: int

"""ls=

res,i,j=0,0,0

while i時間複雜度為o(2n)=o(n),最壞情況下,每個字元將被i和j訪問兩次.

3.優化的滑動視窗:

如果s[j]在[i,j)範圍內有重複的字元,不需要逐步增加i.而是直接跳過[i,j]內的所有元素,並將i變為j+1

class solution(object):

def lengthoflongestsubstring(self, s):

""":type s: str

:rtype: int

"""res,i=0,0

d={}

for j in range(len(s)):

if s[j] in d:

i=max(d[s[j]],i)

res=max(res,j-i+1)

d[s[j]]=j+1

return res

時間複雜度為o(n)

LeetCode第3題題解 無重複字元的最長子串

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

LeetCode刷題實戰3 無重複字元的最長子串

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

leetcode刷題之路3 無重複字元的最長子串

給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。字元陣列和字串的區別,c語言字元陣列和字串區別詳解 開始的想法是在對字元陣列設定兩個指標,初始化乙個在位置0乙個在位置1,ans初始化...