给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
思路分析:
1、遍历字符串,定义一个字典存储无重复字符以及字符在串s的下标位置。
2、定义最长子串的长度变量le,探索串s的起始指针start。
3、遇到字符在字典中:
字符上次出现的位置在start后面或与start相等,start后移到上次出现位置的后一位;
否则记录字符位置,start不动。
4、字符不在字典中,继续遍历,记录当前字符下标。
如:
a b c a b c b b
i
strat
a b c a b c b b
i
start(le=i-start+1)
a b c a b c b b
i
start
a b c a b c b b
i
start(le>i-start+1,不变)
def lengthOfLongestSubstring(self, s: str) -> int:
if not s:
return 0
le,start=0,0
dic={}
for i in range(len(s)):
val=s[i]
if val in dic:
if dic[val]+1>start:
start=dic[val]+1
dic[val]=i
else:
dic[val]=i
if i-start+1>le:
le=i-start+1
return le