您的位置:首页 > 其它

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

2020-03-30 08:08 274 查看

题目描述:(本文所指代码均为LeetCode官方题解中所给代码)

给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。

1.暴力法

(1)主要思想:枚举所有子串

-----------------插曲:胡思乱想-----------------

下述两种算法的思想来源:

  • 枚举所有子串,再一一检查,太浪费时间了,我们能不能直接枚举无重复字符的子串呢。所以,现在问题的关键就转换到了如何枚举无重复字符的子串。
  • ②如何确保枚举完全? 我们可以用指针j依次遍历字符串中的每个字符,并枚举以指针j所指向的字符为结尾字符且无重复字符的子串。 至于为什么要让每个字符依次作为结尾字符向前寻找无重复字符子串呢? 应该是方便“优化滑动窗口”方法的直接跳跃吧。
    例:寻找abcabcbb字符串的满足题目要求的最长子串。
    a→ab→abc→bca→cab→abc→cbb
  • ③如何确保子串无重复字符?先确保子串有重复字符。 包含以相同字符开始和结束的子串定然无法满足题目要求,如“☆○△☆”。而下一个无重复字符子串的起始字符必为刚才打头的重复字符的后一字符,即“○”。因此,i与j两指针所确定的子串中是否包含相同的字符非常关键,若包含,i指针便需向后移动,只不过移动的方式有所不同。

-------------------------------------------------------

2.滑动窗口

(1)主要思想:枚举无重复字符的子串
(2)方法:依次遍历字符串中的每个字符,并枚举以其为结尾字符的且无重复字符的子串。
(3)指针i移动方式:j为遍历指针,i指针以一个字符为单位移动直至子串中不包含j指针所指字符。
(4)数据结构:HashSet类。

3.优化的滑动窗口

(1)主要思想:枚举无重复字符的子串
(2)方法:依次遍历字符串中的每个字符,并枚举以其为结尾字符的且无重复字符的子串。
(3)指针i移动方式:j为遍历指针,i为跳跃指针。i指针直接跳跃到下一个无重复字符子串的起始字符。
(4)数据结构:HashMap类。

4.我遇到的问题

(1)“i = Math.max(map.get(s.charAt(j)), i);”这条语句为什么要取max?
如:“abcba”字符串。当指针j移动到第二个“b”字符时,指针i应移动到字符“c”。这个指针i的位置是确保后续子串无重复字符的分界线。当指针j移动到最后一个字符“a”时,其最远应当只能看到指针i所指位置的“c”字符,即指针i的取值范围为[c,…]。为确保指针不左移,因此使用了max函数。
(2)为什么map中的键值对会更新?
:)嘲笑一下自己…因为程序执行完if语句后还会接着执行后面的语句。

胡思乱想所得,欢迎指正,欢迎讨论。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
小聂瞎胡写 发布了1 篇原创文章 · 获赞 0 · 访问量 46 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: