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

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

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 = 0
        start = 0
        for i, char in enumerate(s):
            if char in char_index_map and char_index_map[char] >= start:
                start = char_index_map[char] + 1
            char_index_map[char] = i
            max_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.kler.cn/news/355522.html

相关文章:

  • Java老鸟前端小白uniapp+uview开发小程序第2天
  • HTML第一次作业
  • 【X11转发】解决远程服务器无法显示可视化GUI问题(Mac m1)
  • WS2812 可以用3.3V 电源驱动
  • docker 多架构接口数据交换
  • 人工智能教学实验箱_国产处理器:5-29 语音识别控制实验
  • 深入了解Vue Router:基本用法、重定向、动态路由与路由守卫的性能优化
  • laravel .env环境变量原理
  • 用Python删除PDF文档页面的页边距
  • ts 中 Omit 作用
  • JavaScript 第17章:性能优化
  • Chapter09
  • perl替换文件中的特定内容
  • 海南聚广众达电子商务咨询有限公司靠谱吗怎么样?
  • Uptime Kuma: 全面的开源网站监控解决方案
  • 青少年编程能力等级测评CPA C++(二级)试卷(2)
  • JavaScript的第三天
  • VSCode C/C++跳转到定义、自动补全、悬停提示突然失效
  • Rocky Linux 9安装Asterisk 20和freepbx 17脚本——筑梦之路
  • Rust各个方面完胜C++吗?