给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 "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