题目:一个字符串,找出不含有重复字符的最长子串的长度。
例子: 假定给出字符串:"mabcafrab" , 那么它的最长不重复子串是“bcafr”
加入给出是“aaaaaaaa”,那么它的最长不重复是“a”
思路: 设置一个字典类型,dic{当前字符, 当前字符的位置}, 初始为{}, 判断字符串字符,如果字符不在dic中,则把这个字符加入,{'m':0}, 同时如果当前位置的字符所在的value大于等于start 值,则把start 置为value+1. 比如上例中, 到第5个字符‘a’时,dic['a']其实是 1.那么我们需要把start 设置为1+1,start 从b开始,就是说重复的我们暂时摒弃了。这种情况dic['a'] = 4, 在这次计算中。字符长度是i-start+1. 比较max_len 和当前i-start+1的大小。赋值给max_len
def maxlengthofSubstring(s):
max_len =0
dic = {}
flag_len = 0
start = 0
if s is None or len(s)==0:
return 0
for i in range(len(s)):
if(s[i] in dic and dic[s[i]]>=start):
start = dic[s[i]]+1
flag_len = i- start +1
dic[s[i]] = i
max_len= max(max_len, flag_len)
print(dic, start, max_len)
return max_len
print(maxlengthofSubstring("mabcafrab"))
{'m': 0} 0 1
{'m': 0, 'a': 1} 0 2
{'m': 0, 'a': 1, 'b': 2} 0 3
{'m': 0, 'a': 1, 'b': 2, 'c': 3} 0 4
{'m': 0, 'a': 4, 'b': 2, 'c': 3} 2 4
{'m': 0, 'a': 4, 'b': 2, 'c': 3, 'f': 5} 2 4
{'m': 0, 'a': 4, 'b': 2, 'c': 3, 'f': 5, 'r': 6} 2 5
{'m': 0, 'a': 7, 'b': 2, 'c': 3, 'f': 5, 'r': 6} 5 5
{'m': 0, 'a': 7, 'b': 8, 'c': 3, 'f': 5, 'r': 6} 5 5
5