var lengthOfLongestSubstring = function (s) { let len = s.length; let longestLen = 0; for (let i = 0; i < len; i++) { for (let j = 1; j <= len; j++) { if (allUnique(s, i, j)) longestLen = Math.max(longestLen, j - i); } }
return longestLen; };
functionallUnique(s, start, end) { letset = new Set();
for (let i = start; i < end; i++) { if (set.has(s[i])) return false; set.add(s[i]); }
var lengthOfLongestSubstring = function (s) { let len = s.length; letset = new Set(); let i = 0; let j = 0; let ans = 0; while (i < len && j < len) { if (!set.has(s[j])) { set.add(s[j++]); ans = Math.max(ans, j - i); } else { set.delete(s[i++]); } }
return ans; };
我们还可以使用数组及其 push 和 shift 方法来模拟滑动窗口:
var lengthOfLongestSubstring = function (s) { let ans = 0; let temp = []; let i = 0; while (i < s.length) { if (temp.indexOf(s[i]) === -1) { temp.push(s[i++]); ans = Math.max(ans, temp.length); } else { temp.shift(); } }
var lengthOfLongestSubstring = function (s) { let ans = 0; let temp = []; let i = 0; while (i < s.length) { let index = temp.indexOf(s[i]); if (index === -1) { temp.push(s[i++]); ans = Math.max(ans, temp.length); } else { temp.splice(0, index + 1) } }
return ans; };
也可以使用 Map 数据结构来对下标进行维护:
var lengthOfLongestSubstring = function (s) { let len = s.length; let map = newMap(); let ans = 0; for (let i = 0, j = 0; j < len; j++) { if (map.has(s[j])) { // 例如 'abcaabc',当移动到第二个 b 时, i = 4,j = 5,map.get('b') = 2,即 map 内重复的 b 不在滑动窗口内,故此时不能直接让 i = map.get(s[j]),需要对边界进行判断 i = Math.max(i, map.get(s[j])); }