问题描述
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
var s = "dacab";
解题思路一
1.创建一个set
2.两个指针,第一个指向字符串的开头j,第二个随着for循环遍历字符串i.
3.如果set里没有s[i],说明目前为止还没有重复的字符,把s[i]添加到set里,然后更新最大不重复字符的数量。
4.如果set里有s[i],则从set里开始删除s[j],并且递增j,再检查set里是否有s[i],
如此反复直到set里没有s[i]为止。
5.重复步骤3和4,直到遍历完整个字符串
代码如下
const set = new Set();
var i = 0,
j = 0,
maxlength = 0;
if (s.length == 0) {
return 0;
}
for (i; i < s.length; i++) {
if (!set.has(s[i])) {
set.add(s[i]);
maxlength = Math.max(maxlength, set.size);
} else {
while (set.has[s[i]]) {
set.delete[s[j]];
j++;
}
set.add(s[i]);
}
}
console.log(maxlength);
解题思路二
双指针,右指针不断移动,每遇到一个字符就通过map记录该字符及其最后一次出现的索引值,若判断是出现过的字符,且上次出现的位置大于等于左指针,则左指针移到上一次出现的位置的下一个位置
举个栗子:字符串bacab
- 初始化左右指针均为0,将(b,0),加入map。
- 右指针移动到1,a无重复,将(a,1),加入map。当前时刻字串为ba,长度为2.
- 右指针移动到2,c无重复,将(c,2),加入map。当前时刻字串为bac,长度为3.
- 右指针移动到3,a出现重复 且a上一次出现的位置1大于左指针的位置0,移动左指针到2,当前时刻字串为ca,长度为2,将(a,3),加入map。
- 右指针移动到4,b出现重复但b上一次出现的位置0小于左指针的位置2,若左指针移动,则左指针移动到1,当前时刻字串为acab,出现重复字符。所以此时左指针不移动,当前时刻字串为cab,长度为3,并将(b,4),加入map。
代码如下
var left = 0,
ans = 0;
let map = new Map();
for (var i = 0; i < s.length; i++) {
if (map.has(s[i]) && map.get(s[i]) >= left) {
left = map.get(s[i]) + 1;
}
map.set(s[i], i);
if (i - left + 1 > ans) {
ans = i - left + 1;
}
}
console.log(ans);