难度:中等
思路:用2个变量(start, end)分别保存子串的起点和终点。end自增,直到遇到重复字符为止;从重复字符出现的位置之后1位重新开始扫描。
陷阱:重新开始扫描的位置;循环结束条件
代码:
class Solution:
# @param {string} s
# @return {integer}
def lengthOfLongestSubstring(self, s):
len_max = 0
start = 0
sub_string = ''
for end in xrange(len(s)):
if s[end] not in sub_string:
sub_string += s[end]
else:
len_max = max(len_max, len(sub_string))
while s[start] != s[end]:
start += 1
start += 1
sub_string = s[start : end + 1]
return max(len_max, len(sub_string))
以上解法可求出最大无重复字符的子串本身,由于题目只要求求出最大无重复字符的子串的长度,因此可用Python集合(set)类型略作优化如下:
class Solution:
# @param {string} s
# @return {integer}
def lengthOfLongestSubstring(self, s):
length = 0
char_set = set()
start = end = 0
while start < len(s) and end < len(s):
if s[end] in char_set:
length = max(length, end - start)
char_set.remove(s[start])
start += 1
else:
char_set.add(s[end])
end += 1
return max(length, end - start)