最长重复子串

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

1
2
3
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

我的暴力解法

算法思路:

  1. 创建一个 hash 表(查询专用)
  2. 初始化 max,count(计算无重复子串达到的值)
  3. 当元素没在 hash 表中,加入 hash 表,并且 count+1, max 赋予最大值
  4. 当 hash 存在,hash 表的值变为零,count =0,结束最里层循环,然后到接下的字符。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var lengthOfLongestSubstring = function (s) {
let hash = {};
let max = 0;
let count = 0;
for (i = 0; i < s.length; i++) {
for (j = i; j < s.length; j++) {
if (hash[s[j]]) {
hash = {};
count = 0;
break;
} else {
hash[s[j]] = s[j];
count++;
max = Math.max(count, max);
}
}
}

return max;
};

暴力法固然简单,其实这之之前,我有想到用一个队列和 hash 组合的,但我只是利用站遍历,并没有运用到窗口滑动的思想。
窗口滑动,核心思想,在队列中 [1,2,3,4],通过某种判断,一步步的弹出首元素。
在这道题中的运用,比如 [a,b,c,a,e],弹出 a,b,c 加入 hash 中,当 加入 a 时,已经有了重复,这个时候队列从 b 开始

模版:

  1. 左右指针,构建窗口
  2. 循环–,先增加 右指针–知道不能构建。
  3. 收缩窗口。也就把窗口减小
  4. right 继续变动,
  5. 遍历结束

to do

https://coolcao.com/2020/04/30/SlidingWindowAlgorithm/


http://example.com/算法与数据结构/最长重复字符串/
作者
chen heng cheng
发布于
2024年5月30日
许可协议