- 题目描述
给定一个字符串,找出不含有重复字符的最长子串的长度。
- 示例1
输入: "abcabcbb"
输出: 3
解释: 无重复字符的最长子串是 "abc",其长度为 3。
- 示例2
输入: "bbbbb"
输出: 1
解释: 无重复字符的最长子串是 "b",其长度为 1。
- 示例3
输入: "pwwkew"
输出: 3
解释: 无重复字符的最长子串是 "wke",其长度为 3。
请注意,答案必须是一个子串,"pwke" 是一个子序列 而不是子串。
- 解决方案
遍历字符串中的每一个字符,用键值对记录每个字符最后出现在字符串中的下标(str_dict),用变量记录当前无重复字符串开始的位置(start)。
比较难理解的部分就是在遍历过程中,判断当前字符是否在上一次的无重复字符串中出现过,如果没有,那么可以直接把长度加1,更新该字符的下标;如果出现过的话,那么就要改变start的位置,重新计算长度,再更新该字符的下标。
- 代码
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
if s is None or len(s) == 0:
return 0
#要返回的值:无重复字符的最长子串长度
res = 0
#存储每个字符最后出现时的下标
str_dict = {}
#记录当前字符串开始的下标
start = 0
#记录当前字符串的长度
length = 0
#循环遍历
for i in range(len(s)):
#如果当前字符已经出现过,而且就在上次得到的无重复字符串里边
if s[i] in str_dict and str_dict[s[i]] >= start:
#那么开始的位置改变为当前字符出现过的位置+1
start = str_dict[s[i]] +1
#当前无重复字符的字串长度
length = i -start + 1
#修改当前字符的下标值
str_dict[s[i]] = i
#更新返回值
res = max(res,length)
return res