持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情
你的随口一句,不管是否敷衍,我都会放进心里,然后去做,去改
原题链接:3-无重复字符的最长子串
给定一个字符串
s,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 10^4s由英文字母、数字、符号和空格组成
思路
- 在遍历的时候,用双指针维护一个滑动窗口的左右边界,左指针负责收缩边界,右指针负责扩张边界
- 右指针不断滑动的过程中,如果元素不重复,就不断往哈希表里添加;如果遇到重复元素,就控制左指针收缩边界,并记录子串长度
Code
const lengthOfLongestSubstring = s => {
let slow=0,// 左指针
res = 0, //返回值
map = new Map(); // 创建哈希表存放字符和对应下标
for (let fast = 0; fast < s.length; fast++) {
// 如果出现了重复字符并且重复字符的索引大于左指针,就把左指针移动到对应字符的下一位
if (map.has(s[fast]) && map.get(s[fast]) >= slow) {
slow = map.get(s[fast]) + 1;
}
res = Math.max(res,fast - slow + 1); //取最长子串的长度
map.set(s[fast], fast); // 存下每个字符的下标
}
return res;
};