题目描述
给定一个字符串,找出不含有重复字符的最长子串的长度。
示例
输入: "abcabcbb"
输出: 3
解释: 无重复字符的最长子串是"abc",其长度为 3。
输入: "bbbbb"
输出: 1
解释: 无重复字符的最长子串是"b",其长度为 1。
输入: "pwwkew"
输出: 3
解释: 无重复字符的最长子串是"wke",其长度为 3。
请注意,答案必须是一个子串,"pwke" 是一个子序列 而不是子串。
代码实现
class Solution:
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
l, start, n = 0, 0, len(s)
maps = {}
for i in range(n):
start = max(start, maps.get(s[i], -1)+1)
l = max(l, i - start+1)
maps[s[i]] = i
return l
思路
使用hashmap,将每一个已经阅读过的字符作为键,所对应的值为其在原字符串中的位置。
遍历字符串中每一个字符,如果它没在hashmap中,就加入到hashmap;当遍历到的某个字符在hashmap中出现过,证明有重复的字符,此时maps.get(s[i],-1)大于等于start,需要重新设置最长子串的长度跟最长子串的开始位置(maps.get(s[i])的下一个位置开始,即它加1的位置)。当字符不出现在hashmap中时,这个maps.get(s[i],-1)永远只会返回-1,-1+1=0<start的。
注:dict.get(key, default=None) :
- key -- 字典中要查找的键。
- default -- 如果指定键的值不存在时,返回该默认值。