目录
一、题目描述
1. 给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。
2. 示例 1
输入:s = "ancabcbb"
输出:3
解释:因为无重复字符的最长子串是"abc",所以其长度为3
示例 2
输入:s = "bbbbbb"
输出:1
解释:因为无重复字符的最长子串是"b",所以其长度为1
3. 提示
0 <= s.length <= 5*10^4
s 由英文字母、数字、符号和空格组成
二、代码实现
1. 方法1:暴力求解(找到所有子串,判断子串是否仅含有唯一字符,计算整体复杂度)
2. 方法2:滑动窗口及优化(找关键字【重复字符】;模式识别1【一旦涉及出现次数,需要用到散列表】;构造子串,散列表存下标;模式识别2【涉及子串,考虑滑动窗口】)
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
# 使用map,然后移动右指针,并且不需要移除字符的操作(@Zeeq)
lens = len(s)
if lens<2: return lens # 如果字符串长度小于等于1,直接返回长度
hashmap = {s[0]:0} # 初始化hashmap,加入第一个字母
left, right = 0, 1 # 初始化左右端点,这里,right是还没遍历的
maxlen = 1 # 记录最长个数
# 迭代条件是左指针小于右指针并且右指针在长度范围内
while left<right and right<lens:
# 若右端点在map中并且map中记录的该字母的出现位置大于等于left,
# 那么就需要更新left到该记录位置的下一个位置上
if s[right] in hashmap and hashmap[s[right]]>=left:
left = hashmap[s[right]]+1
# 更新操作
hashmap[s[right]] = right # 若已存在则修改位置,没存在则加入map
right+=1 # 右指针右移
maxlen = max(maxlen, right-left) # 更新最大长度
return maxlen
三、复盘
1. 做着做着就好气馁,论文论文不会写,力扣力扣刷不动,人际关系也搞不好,咱就是说真的会emo (如果说这就是在走上坡路的话,真的走的好迷茫好艰难哦),有没有uu来讨论一下~
2. 补一下字符串(Python)中的基础语法
3. 可能刷力扣第一反应是不会,有点不知道不会之后要怎么做【学不明白了 我好菜】~
4. 参考