leetcode3:無重復字符的最長子串


給定一個字符串,找出不含有重復字符的最長子串的長度。

示例:

給定 "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'))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM