描述
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
算法思路
采用滑动窗口方法
- 定义左右指针
- 开始的时候,左右指针位置一样,右指针向右移动,记录遍历过的字符位置
- 直到遇到已经遍历过的,且目前已存在的位置大于或等于左指针位置,然后将起点位置设置到目前存在的字符下标后一位
- 然后继续遍历,直到结束,获取最长的长度即为结果
- 子串abcabcbb遍历过程如下
- abc 第四个a,相同,记录目前的长度 7. 因此将左指针start移动到map中的a的下标值后一位,右指针继续遍历,直到循环结果
算法代码
var lengthOfLongestSubstring = function(s) {
let start = 0, len = 0;
const map = new Map();
for (let end = 0; end < s.length; end++) {
const char = s[end];
// 如果map对象中存在该字符,且该下标大于等于目前的左指针,则移动左指针
if (map.has(char) && map.get(char) >= start) {
start = map.get(char) + 1;
}
// 将遍历过的字符传入map对象
map.set(char, end)
// 记录每一次处理的长度
len = Math.max(len, end - start + 1);
}
return len;
};
PS:该文是对leetcode的知识笔记,欢迎交流