暴力求解法
思路
两遍循环
代码
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
var max = 0;
for (let i = 0; i < s.length; i++) {
var sum = 1; //记录本次无重复字符的最长子串数
var map = new Map();
map.set(s[i], i);
for (let j = i + 1; j < s.length; j++) {
if (!map.has(s[j])) {
map.set(s[j], j);
sum++;
} else {
break;
}
}
max = (sum > max ? sum : max);
}
return max;
};
滑动窗口法
性能更差了,让我在研究研究。。。
代码
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
var left = 0;
var right = 0;
var map = new Map();
var max = 0; //记录无重复最长子串长度
if (s.length === 0) return 0;
while (right < s.length) {
if (!map.has(s[right])) {
map.set(s[right], right);
right++;
max = (right - left > max ? right - left : max);
} else {
max = (right - left > max ? right - left : max);
left = map.get(s[right]) + 1;
map = new Map([...map].filter(([k, v]) => (v >= left && v < right)));
map.set(s[right], right);
right++;
}
}
return max;
};