手写算法:无重复字符的最长子串
思路一:left、right 的 while 循环双指针滑动窗口
可以用滑动窗口来实现
用 left、right 双指针,遍历字符串,通过 hash set 将字符保存起来,遇到重复字符时,收紧窗口。
收紧窗口的同时,需要将窗口内的重复字符剔除掉,再往右走,直到走完整个字符串。
function lengthOfLongestSubstring(s) {
const len = s.length;
// 左右指针初始都为0
let left = 0,
right = 0;
// 最大子串长度
let maxLength = 0;
// 滑动窗口,存储字符
let window = new Set();
while (left < len && right < len) {
// 判断滑动窗口中是否包含字符
if (window.has(s.charAt(right))) {
// 剔除重复字符
window.delete(s.charAt(left));
// 收紧窗口
left++;
} else {
// 不包含,添加字符
window.add(s.charAt(right));
// 指针继续向右
right++;
// 计算当前重复子串的长度
const curLength = right - left;
// 取最大的长度
maxLength = Math.max(maxLength, curLength);
}
}
return maxLength;
}
思路二:for 循环滑动窗口
这样不用每次都计算 right 的值
当 i=0 的时候,窗口不向右移动
var lengthOfLongestSubstring = function(s) {
const len = s.length;
let set = new Set(),
point = 0,
max = 0;
for (let i = 0; i < len; i++) {
if (i !== 0) set.delete(s[i - 1]);
while (point < len && !set.has(s[point])) {
set.add(s[point]);
point++;
}
max = Math.max(max, set.size);
}
return max;
};
手写题:手写 vuex 新版和老版
手写 vuex 新版和老版