力扣-无重复字符的最长子串
无重复字符的最长子串
题目描述
题目链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
难度:中等
给定一个字符串
s,请你找出其中不含有重复字符的 最长子串 的长度。
解析
由于题目要求最长子串,其可以在原串中表示为一个区间,也就是说,我们要在原字符串中找到一个最大的区间,这个区间内无重复字符。这就很容易能想到滑动窗口。
下面来说一下算法思想:我们维护两个整数,一个是区间起点,用start表示;一个是区间终点,用end表示,首先在固定start的同时尽可能让end后移,每次后移时判断一下新加入的字符是否已经存在,这个可以用集合set轻松实现,我偷懒用的字典。如果新加入的字符已经在原区间内,则移动start,一直移动到没有重复字符为止。每次移动后都去更新一下ans,把最大的留下来
代码
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
visit = {} # 记录区间内已经存在的字符
start, end = 0, 0 # 区间端点
ans = 0 # 记录答案
str_len = len(s)
while end < str_len:
if not visit.get(s[end], False): # 当前要加入的字符不会导致重复
visit[s[end]] = True
end += 1
else: # 当前加入的字符会导致重复
while s[start] != s[end]:
visit[s[start]] = False
start += 1
visit[s[start]] = False
start += 1
ans = max(ans, end - start) # 更新答案
return ans
总结
本题难度相比于前面两道简单题确实多了一些需要思维的过程,但是也是很简单的那种了。

浙公网安备 33010602011771号