本文最后更新于570 天前,其中的信息可能已经过时,如有错误请发送邮件到1986413837@qq.com

本题思路:滑动窗口
不断维护窗口左右下标 窗口的长度即为当前子串的长度
需要设置变量left和right
初识化一个判断数组has[] 判断当前字符是否已经在字符串中存在
若不存在 将当前字符标记为true 代表加入当前字符
若存在 将当前字符标记为false 表示除去这个字符 表示并且使left++ 缩小窗口
最后当前遍历情况下的right-left+1即为区间长度 需要和之前的长度进行比较 获得最大的区间长度即可
#define MAX(a, b) ((b) > (a) ? (b) : (a))
int lengthOfLongestSubstring(char* s) {
int ans = 0, left = 0;
bool has[128] = {};
for (int right = 0; s[right]; right++) {
char c = s[right];
// 如果窗口内已经包含 c,那么再加入一个 c 会导致窗口内有重复元素
// 所以要在加入 c 之前,先移出窗口内的 c
while (has[c]) { // 窗口内有 c
has[s[left++]] = false; // 缩小窗口
}
has[c] = true; // 加入 c
int len = right - left + 1;
ans = MAX(ans, len); // 更新窗口长度最大值
}
return ans;
}
这里用C语言宏定义了一个获得最大值功能 注意学习一下
因为本题字符均为ASCII字符 所以判断数组大小设为128
本题也可以用JS中的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++]); // 缩小窗口
}
window.add(c); // 加入 c
ans = Math.max(ans, right - left + 1); // 更新窗口长度最大值
}
return ans;
};