Amanda-Zhang
追梦女一枚

力扣每日一题-无重复字符的最长子串

2021-03-03 -leetcode -算法
Word count: 538 | Reading time: 2min

题目

题解

思路:

这道题目主要用到的思想是: 滑动窗口

什么是滑动窗口?

其实滑动窗口我们可以看出一个队列,比如题目中 abcabcbb, 进入这个队列(窗口)为abc此时满足题目要求,当再进入一个a,也就是当窗口向右扩大的时候,队列变成了abca,这个时候不满足要求,所以,我们要移动这个队列。

具体应该如何移动呢?

我们只需要把队列的左边的元素移除出去就可以了,直到满足题目要求!

一直维持这样的队列,找出队列出现最长的长度时候,求出解。
具体实现:

在js中我们使用一个数组来维护滑动窗口

遍历字符串,判断字符串是否在滑动窗口数组里面

不在则push进数组
在则删除滑动窗口数组里相同字符以及相同字符前的字符,然后将当前字符push进数组
然后将max更新为当前最长子串的长度

遍历完成,返回max即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var lengthOfLongestSubstring = function(s) {
// 滑动窗口初始化为一个空数组
let arr = [];
// 要返回的字符串的长度
let max = 0;
for (let i = 0; i < s.length; i++) {
// 使用 indexOf 判断是否在数组中出现过
let index = arr.indexOf(s[i])
// 如果出现过
if (index !== -1) {
// 从数组开头到当前字符串全部截取掉
arr.splice(0, index + 1);
}
// 在窗口右边放进新的字符
arr.push(s.charAt(i));
// 更新下最大值
max = Math.max(arr.length, max);
}
// 返回
return max;
};

另一种用另一个数据结构,即Set集合,表示更方便一些。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var lengthOfLongestSubstring = function(s) {
const set = new Set();
let i = 0,j = 0,maxLength = 0;
if(s.length === 0){
return 0;
}
for(i;i<s.length;i++){
if(!set.has(s[i])){
set.add(s[i]);
maxLength = Math.max(maxLength,set.size)
}else{
while(set.has(s[i])){ //这里的思想和上面的相同,将已有的重复元素之前的全部删掉
set.delete(s[j]);
j++;
}
set.add(s[i]);
}
}
return maxLength;
};
< PreviousPost
力扣每日一题-最长回文子串
NextPost >
堆的相关知识
CATALOG
  1. 1. 题目
  2. 2. 题解