給定一個字符串,找出不含有重復字符的最長子串的長度。
示例:
給定 "abcabcbb"
,沒有重復字符的最長子串是 "abc"
,那么長度就是3。
給定 "bbbbb"
,最長的子串就是 "b"
,長度是1。
給定 "pwwkew"
,最長子串是 "wke"
,長度是3。請注意答案必須是一個子串,"pwke"
是 子序列 而不是子串。
1.我的思路:
1 class Solution: 2 def lengthOfLongestSubstring(self, s): 3 n = len(s) #字符串長度 4 l = list(s) #將字符串轉換成list 5 resultList = [] #構建一個新的list存放第0個至第n-1個元素開頭的最長字串長度 6 for x in range(n): #遍歷每個可能的字符串子串,找到不重復的最大長度子串並將長度返回到resultList 7 number=0 8 while len(l[x:x+number+1]) == len(set(l[x:x+number+1])) and x+number+1<=n: 9 number=number+1 10 resultList.append(number) 11 if resultList == []: #返回resultList中的最大值 12 return 0 13 else: 14 return max(resultList) 15 solution = Solution() 16 print(solution.lengthOfLongestSubstring('abc'))
2.參考網上的思路。構建一個滑動窗。
一個變量(start)存儲無重復字符子串開始的索引,構建一個字典(window)來存放每個元素最后出現的的索引。
判斷下一個元素是否存在於字典中,若不存在,則將該元素加入字典,並更新當前長度;若存在,則從字典中該元素的下一位存為start,把元素存入字典;
遍歷結束,返回當前長度。
1 class Solution: 2 def lengthOfLongestSubstring(self, s): 3 l = list(s) #將字符串轉換成list 4 window = {} 5 start = 0 #無重復子串的開始位置 6 maxlen = 0 #當前最大的無重復子串的長度 7 for i in range(len(l)): 8 if (l[i] in window) and (window[l[i]] >= start): 9 start = window[l[i]]+1 10 window[l[i]] = i 11 else: 12 window[l[i]] = i 13 maxlen = max(maxlen,i-start+1) 14 return maxlen 15 solution = Solution() 16 print(solution.lengthOfLongestSubstring('abc'))