给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。滑动窗口:
子串,意思是字符串 s 中间的某一部分,所以可以想象有一个遮罩层,在整个 s 上从左向右滑动,中间经历过最长的一个不重复的子串,就是题目要求的。
const lengthOfLongestSubstring = (s) => {
if (s.length === 0) return 0; // 如果传入的字符串长度为0 ,直接返回 0
let maxLength = 0; // 存储最长的 子串长度
let arr = []; // 存储当前的子串(不一定是最长的,可能有重复子串)
for (let i = 0; i < s.length; i++) { // 循环 s 的每一个元素
if(arr.includes(s[i])) { // 如果 arr 里面有当前的字符,则说明当前子串中有重复字母(此时只可能是最后一个字母和前面的字母有重复)
while(arr.includes(s[i])) { // 删除当前子串的第一个字母,如果还有重复,接着删除
arr.shift();
}
}
arr.push(s[i]); // 如果没有重复,则将当前字符存入 arr 数组中
maxLength = Math.max(maxLength, arr.length) // 每次都保存一下最长子串的长度,供返回结果使用
}
return maxLength
}