题目
解题思路
思路
方法: 滑动窗口
[!简单思路]
[^1]以示例一中的字符串 abcabcbb 为例,找出==从每一个字符开始的,不包含重复字符的最长子串==,其中最长的那个字符串即为答案。
对于示例一中的字符串,我们列举出这些结果,其中括号中表示选中的字符以及最长的字符串:
以 (a)bcabcbb 开始的最长字符串为 (abc)abcbb;
以 a(b)cabcbb 开始的最长字符串为 a(bca)bcbb;
…
[!为什么可以使用滑动窗口]
依次递增地枚举子串的起始位置,那么子串的结束位置也是递增的!这里的原因在于,假设我们选择字符串中的第 k 个字符作为起始位置,并且得到了不包含重复字符的最长子串的结束位置为 r
k。那么当我们选择第 k+1 个字符作为起始位置时,首先从 k+1 到 r
k的字符显然是不重复的,并且由于少了原本的第 k 个字符,我们可以尝试继续增大 r
k,直到右侧出现了重复字符为止。
这样一来,我们就可以使用「滑动窗口」来解决这个问题了:
具体实现
分析Set方法在最长无重复子串问题中的应用
在本题中,使用了哈希集合的