3. 无重复字符的最长子串
分析:快速获取连续无重复的最长字符串个数
题目
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
思路:
答案
队列实现
/**
* @description 滑动窗口(队列)实现
* 其实就是一个队列,比如字符串 abcbd,进入这个队列(窗口)为 abc 满足题目要求,当再进入 b,队列变成了 abcb,这时候* 不满足要求。所以,我们要移动这个队列!如何移动?我们只要把队列的左边的元素移出就行了,直到满足题目要求!一直维持这样的队 列,找出队列出现最长的长度时候,求出解!
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(str) {
let i = 0
let max = 0
let que = []; // 队列
while(i < str.length) {
if(que.indexOf(str[i]) == -1) {
que.push(str[i]);
} else {
que.shift();
continue;
}
max = Math.max(max, que.length);
i++;
}
return max;
};
console.log(lengthOfLongestSubstring("abcabcbb"))
两根手指法(滑动窗口)
var lengthOfLongestSubstring = function(str) {
// 最长个数
let count=0;
let set=new Map();
//左指针用来收缩窗口
let left=0;
//右指针用来扩张窗口
let right=0;
// 收缩窗口遍历完成则全部结束
while(left<str.length ){
console.log('左指针',left)
//如果不重复,就不断扩张窗口,元素添加到set中
while(right < str.length && !set.has(str[right])){
set.add(str[right])
// 继续从当前增加,无需从0
right++
console.log('右指针',right,str[right],set)
}
// 出现重复(记录当前最长字符串个数)与之前count比较,取最大值
count = Math.max(count,right-left);
// 收缩窗口: 直接删除重复的第一项
set.delete(str[left]);
left++;
}
return count;
};
console.log(lengthOfLongestSubstring("abcabcbb"))
// 3