当前位置: 首页 > news >正文

滑动窗口-无重复字符的最长字串

max_length 更新保存的结果
start 更新最长字串的起始位置
char_index_map[char] + 1 重复位置+1作为新的起始位置
i - start + 1 最长字串的末尾位置为i
char_index_map[char] >= start
(1) = : 新的重复位置在最开始start
(2) > : 新的重复位置在max_length中间

以s只有一个元素为例子:
i = 0
i - start + 1 = 1

# 3. 无重复字符的最长子串

代码:

class Solution:def lengthOfLongestSubstring(self, s: str) -> int:char_index_map = {}max_length = 0start = 0for i, char in enumerate(s):if char in char_index_map and char_index_map[char] >= start:start = char_index_map[char] + 1char_index_map[char] = imax_length = max(max_length, i - start + 1)return max_length

输入:

s = "abcabcbb"

详细执行过程:

初始化:
  • char_index_map = {}:用于记录每个字符及其对应的最新索引。
  • max_length = 0:用于记录最长不重复子串的长度。
  • start = 0:用于记录当前不重复子串的起始位置。
遍历字符串:
  1. i=0, char='a'

    • char_index_map 不包含 'a',即 'a' 还没有出现过。
    • 'a' 存入 char_index_map,即 char_index_map = {'a': 0}
    • 计算当前不重复子串的长度:i - start + 1 = 0 - 0 + 1 = 1
    • 更新 max_length = max(0, 1) = 1
  2. i=1, char='b'

    • char_index_map 不包含 'b'
    • 'b' 存入 char_index_map,即 char_index_map = {'a': 0, 'b': 1}
    • 计算当前不重复子串的长度:i - start + 1 = 1 - 0 + 1 = 2
    • 更新 max_length = max(1, 2) = 2
  3. i=2, char='c'

    • char_index_map 不包含 'c'
    • 'c' 存入 char_index_map,即 char_index_map = {'a': 0, 'b': 1, 'c': 2}
    • 计算当前不重复子串的长度:i - start + 1 = 2 - 0 + 1 = 3
    • 更新 max_length = max(2, 3) = 3
  4. i=3, char='a'

    • char_index_map 包含 'a' 且其索引(0)大于等于 start0)。
    • 说明 'a' 在当前窗口中出现过重复,因此需要调整 start 的位置到 'a' 的下一个位置,即 start = 0 + 1 = 1
    • 更新 char_index_map['a'] = 3(记录 'a' 的最新索引)。
    • 计算当前不重复子串的长度:i - start + 1 = 3 - 1 + 1 = 3(长度保持不变)。
    • max_length = max(3, 3) = 3(长度不变)。
  5. i=4, char='b'

    • char_index_map 包含 'b' 且其索引(1)大于等于 start1)。
    • 'b' 在当前窗口中重复出现,因此将 start 移动到 b 的下一个位置:start = 1 + 1 = 2
    • 更新 char_index_map['b'] = 4(记录 'b' 的最新索引)。
    • 计算当前不重复子串的长度:i - start + 1 = 4 - 2 + 1 = 3
    • max_length = max(3, 3) = 3
  6. i=5, char='c'

    • char_index_map 包含 'c' 且其索引(2)大于等于 start2)。
    • 'c' 在当前窗口中重复出现,将 start 移动到 c 的下一个位置:start = 2 + 1 = 3
    • 更新 char_index_map['c'] = 5
    • 计算当前不重复子串的长度:i - start + 1 = 5 - 3 + 1 = 3
    • max_length = max(3, 3) = 3
  7. i=6, char='b'

    • char_index_map 包含 'b' 且其索引(4)大于等于 start3)。
    • 'b' 在当前窗口中重复出现,将 start 移动到 b 的下一个位置:start = 4 + 1 = 5
    • 更新 char_index_map['b'] = 6
    • 计算当前不重复子串的长度:i - start + 1 = 6 - 5 + 1 = 2(当前子串较短)。
    • max_length = max(3, 2) = 3
  8. i=7, char='b'

    • char_index_map 包含 'b' 且其索引(6)大于等于 start5)。
    • 'b' 在当前窗口中重复出现,将 start 移动到 b 的下一个位置:start = 6 + 1 = 7
    • 更新 char_index_map['b'] = 7
    • 计算当前不重复子串的长度:i - start + 1 = 7 - 7 + 1 = 1
    • max_length = max(3, 1) = 3(没有变化)。
最终结果:
  • 遍历结束后,max_length 是 3,表示最长不含重复字符的子串长度为 3。

http://www.mrgr.cn/news/53498.html

相关文章:

  • vscode open editors 打开
  • 写论文节省论文页面空间的办法
  • latex常见长度单位
  • 第一百零七周周报
  • 如何保护您的服务器免受 POODLE SSLv3 漏洞的影响
  • wpf grid 的用法
  • WordPress任推帮网盘拉新数据统计插件
  • Miniconda管理虚拟环境【Python环境配置】
  • HDU RealPhobia
  • Spring实现3种异步流式接口,解决接口超时烦恼
  • Apple Vision Pro市场表现分析:IDC最新数据揭示的真相
  • 郑州大学第一附属医院许建中教授专家团队会诊室揭牌仪式在郑州长江中医院成功举行
  • 华为杯”第十三届中国研究生数学建模竞赛-E题:基于多目标规划和智能优化算法的粮食最低收购价政策研究(中)
  • LLM 的推理优化技术纵览
  • C++类的构造函数
  • 如何安装MySql
  • JavaWeb 23.NPM配置和使用
  • 【数据分享】中国历史学年鉴(1979-2001)
  • [创业之路-154] :图解:结构需求分析、结构设计、加工、生产的整个流程与常见问题
  • R语言机器学习算法实战系列(八)逻辑回归算法 (logistic regression)