给定一个字符串,找出不含有重复字符的最长子串的长度。

示例:

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

 

posted on 2018-06-20 15:49  一只小皮卡  阅读(1225)  评论(0编辑  收藏  举报