題目描述:
給定乙個字串,找出不含有重複字元的最長子串的長度。
示例:
給定"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初始化...