题目描述
给定一个字符串 s,请你找出其中不含有重复字符的 最长 子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
思路&js代码
1、滑动窗口
function lengthOfLongestSubstring(s: string): number {
let left = 0, right = 0
while (right < s.length) {
const subS = s.slice(left, right + 1)
if (check(subS)) {
right++
} else {
left++
right++
}
}
return right - left
};
// 判断字符串是否不重复
function check(str) {
const arr = Array.from(new Set(str))
return arr.length === str.length
}2、滑动窗口+set
var lengthOfLongestSubstring = function(s) {
let ans = 0;
let left = 0;
const window = new Set(); // 维护从下标 left 到下标 right 的字符
for (let right = 0; right < s.length; right++) {
const c = s[right];
// 如果窗口内已经包含 c,那么再加入一个 c 会导致窗口内有重复元素
// 所以要在加入 c 之前,先移出窗口内的 c
while (window.has(c)) { // 窗口内有 c
window.delete(s[left]);
left++; // 缩小窗口
}
window.add(c); // 加入 c
ans = Math.max(ans, right - left + 1); // 更新窗口长度最大值
}
return ans;
};