LeetCode_3_无重复字符的最长子串_JS
2021-05-14 本文已影响0人
萌多多指教
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
输入: s = ""
输出: 0
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路一:
不用动脑筋的方法,仍然是一个双重循环遍历。从字符串的第一位开始,一个个往后找最长不重复的子串,取长度最大的
例如‘pwwkew’
- 从第0位开始看,p往后找到不重复子串为pw,长度为2
- 第1位w往后不重复子串只有w,长度为1
- 第2位w往后不重复子串是wke, 长度为3
- 第3位k往后不重复子串是kew, 长度为3
- 第4位e往后不重复子串是ew,长度为2
- 最后一位w不重复子串是w,长度为1
- 因此我们得到结果是3
代码实现
var lengthOfLongestSubstring = function(s) {
let max = 0;
for(let i = 0; i<s.length; i+=1) {
let temp = [s[i]];
for(let j = i+1; j<s.length; j+=1) {
if (temp.includes(s[j])) {
break;
}
temp.push(s[j]);
}
max = Math.max(max, temp.length);
}
return max;
};
思路二:
我们用滑动窗口的思想来解决。什么是滑动窗口呢? 我们直接来看这个例子,用例子来说明
例如‘pwwkew’
- 我们先建立一个空窗口,用一个数组来表示windowArr = []
- 遍历字符串,字符串的第0位p在窗口中不存在,我们把它加进去, windowArr = ['p'], 此时最大子串长度为1
- 字符串的第1位w在窗口中不存在,我们把它加进去, windowArr = ['p', 'w'], 此时最大子串长度为2
- 字符串的第2位w在窗口中已经存在了,出现的位置为1,也就是说从位置1往前的任意字符开始到当前位置,都会出现两个重复的w,那位置1之前的所有字符我们都不需要再考虑了,直接把窗口滑到位置1之后,也就是位置2, windowArr = ['w'],此时最大子串长度还是为2
- 字符串的第3位k在窗口中不存在,我们把它加进去,windowArr = ['w', 'k'], 此时最大子串长度为2
- 字符串的第4位e在窗口中不存在,我们把它加进去,windowArr = ['w', 'k', 'e'], 此时最大子串长度为3
- 字符串的第5位w在窗口中已经存在了,出现的位置是0,所以我们把窗口滑到0之后,也就是['k','e', 'w'], 此时最大子串长度为3
字符串已经全部遍历完成,无重复字符的最长子串长度为3
![](https://img.haomeiwen.com/i13053045/db9ab8e5d2e2a0e6.gif)
代码实现
var lengthOfLongestSubstring = function(s) {
let windowArr = [];
let max = 0;
for(let i = 0; i<s.length; i+=1) {
const existedIndex = windowArr.indexOf(s[i]);
if (existedIndex > -1) {
windowArr.splice(0, existedIndex +1);
}
windowArr.push(s[i]);
max = Math.max(max, windowArr.length);
}
return max;
};