给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 "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'))
来源:https://www.cnblogs.com/gaowanru/p/9204187.html