003-无重复字符的最长子串

题目

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

示例 1:

示例 2:

示例 3:

思路

最直接的方式是滑动窗口,它的想法非常朴素:如果从索引 之间的子字符串 已经被检查为没有重复字符。我们只需要检查 对应的字符是否已经存在于子字符串 中。

通过使用 HashSet 作为滑动窗口,我们可以用 的时间来完成对字符是否在当前的子字符串中的检查。

滑动窗口是数组/字符串问题中常用的抽象概念。 窗口通常是在数组/字符串中由开始和结束索引定义的一系列元素的集合,即 。而滑动窗口是可以将两个边界向某一方向“滑动”的窗口。例如,我们将 向右滑动 个元素,则它将变为

我们使用 HashSet 将字符存储在当前窗口 (最初 )中。 然后我们向右侧滑动索引 ,如果它不在 HashSet 中,我们会继续滑动 。直到 已经存在于 HashSet 中。此时,我们找到的没有重复字符的最长子字符串将会以索引 开头。如果我们对所有的 这样做,就可以得到答案。

事实上,上述方法还可以进一步优化,如果出现重复元素( 已经存在于 HashSet 中)就直接将 移动至 元素对应的位置之后,这样就可以不需要对每一个 都进行上述操作了。

我的解答: