Leetcode 3.无重复字符的最长字串
题目链接:
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
思路
对于一个字符串a,假设我们已知其子串a[0:-1] 的最长无重复字符子串的长度为l,那么只需求得包含 a[-1] 的最长无重复子串长度即可知道a的最长无重复子串长度。如果我们还知道包含a[-2] 且不包含a[-1] 的最长无重复子串长度,那我们只需求得a[-1] 上一次出现的位置便可以求解包含a[-1] 的最长无重复子串长度,既可以找到字符a的最长无重复子串长度。那么以此类推,我们只需顺序遍历字符串并同时记录出现过的最长无重复子串长度和当前查找的无重复子串长度,便可以把原问题转化为查找每一个字符上一次出现的位置。而这个问题显然可以用一个hash结构来解决,hash的key表示字符,value表示上一次出现的位置。
代码
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
str_dict = {}
start = 0 #当前无重复子串起始位置
max_length = 0 #最大无重复子串长度
#顺序遍历字符串
for i, sub_s in enumerate(s):
if sub_s in str_dict:
past_index = str_dict[sub_s]
#如果上一次字符出现的位置在当前的无重复子串内,更新不包含sub_s的最长无重复子串长度和当前无重复子串起始位置
if past_index >= start:
max_length = max(max_length, i - start)
start = past_index + 1
#更新sub_s上一次出现的位置
str_dict[sub_s] = i
max_length = max(max_length, len(s)-start)
return max_length