def lengthOfLongestSubstring(s):
d_map = {}
start = maxLength = 0
for i in range(len(s)):
if s[i] in d_map and start <= d_map[s[i]]:
start = d_map[s[i]] + 1
else:
maxLength = max(maxLength, i - start + 1)
d_map[s[i]] = i
return maxLength
s = "abcabcdbb"
print lengthOfLongestSubstring(s)
在Python中,或者在编程语言中,字典的的用处很多,会想起当初写存活主机扫描,第一次用到C++的 map字典,当时惊为天人,第一次用到这么高端的写法,当时感觉真是方便,现在才发现,这个数据结构的用处很多,比如以上的这个算法。
1.首先我们申请一个空的字典,
2.然后定义申请一个字串的最大长度maxLength和每个元素出现的开始首位值start,start这个值仅当字符串中第二次出现时会变化,值等于都一次出现的位置加1即可。
3.开始循环,如果当前字符存在于字典中且start小于当前字符的值,start加上1,否则的话就求出循环到当前位置时最大的字串的长度。
4.最后返回最大字串长度
我们根据字典的特性,很好的求出了子串的长度。
本来我最初的思路是:
1.从第一位遍历,求从这最大字串的长度,
2.然后每次保存到字典,
3.最后求字典中的最大值
最后发现写下来很复杂,而且很多情况没有写进去,就借鉴了别人的写法,果然,时间复杂度降到了最低,也便利了了每个元素,字典中,只存的是字串,很棒的思路,感谢!