题目链接
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
创建两个哨兵,一个哨兵 i,一个哨兵 j,开始站在第一格。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
a | b | c | a | b | c | b | b |
i、j | - | - | - | - | - | - | - |
i 向右移动,每移动一次,都把当前的字符和位置以 key、value 形式存储在 map 集合中。
i 移动到的位置在集合中,如果 i 所在位置的字符在 Map 中能找到,而且这个字符最早出现的位置是在 j 的右边,那么把 j 向当前字符的右边移动一格,同时更新当前字符在 Map 表中的 value。
重复执行上面步骤,直到遍历完字符串。
var lengthOfLongestSubstring = function (s) {
if (s.length == 0) return 0;
if (s.length == 1) return 1;
let map = new Map();
let i = 0,
j = 0,
max = 0;
for (i = 0; i < s.length; ++i) {
if (map.has(s[i]) && map.get(s[i]) >= j) {
j = map.get(s[i]) + 1;
}
map.set(s[i], i);
max = Math.max(i - j + 1, max);
}
return max;
};