Given a string, find the length of the longest substring without repeating characters.
[Examples]
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequence and not a substring.
这道题我们需要借助字典来解决问题。
[思路]
我们遍历这个字符串, 每遍历一个字符, 就要更新一下最大值max_, 遍历完以后max_的值就是最长不重复子串的长度。
遍历前, 子串起始位置是j = 0, 最大子串长度max_初始值是0
遍历过程中:
如果字符不再字典里面, 把字符作为键, 位置作为值, 存到字典里面, 然后取max_和i-j+1的最大值, 更新max_.
如果字符在字典里面, 说明子串出现了重复字符,我们需要更新一下起始位置j, 我们把j指向重复字符的后面一个位置,然后更新一下重复字符键对应的值为当前字符的位置, 表示抛弃之前的重复字符。
最后再更新一下max_的值
这样遍历结束以后, max_的值就是我们要求的值。
[实现代码]
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
adict = {}
j = 0
max_ = 0
for i in range(len(s)):
if s[i] in adict:
j = max(j, adict[s[i]] + 1) //取两者最大值是确保j不会后退, 把之前去掉的重复值又包含进来(ex:'abba')
adict[s[i]] = i
max_ = max(max_, i-j+1)
return max_