题目链接:无重复字符的最长子串
方法1. 使用数组实现滑动窗口
- 使用一个滑动窗口记录当前子串,
- 遍历当前字符串s,判断当前字符是否在滑动窗口中
- 不在,将字符加入当前滑动窗口中
- 在,说明重复,删除与当前字符 第一个重复及其之前的字符
- 每次比较子串的长度
var lengthOfLongestSubstring = function (s) {
let arr=[];
let max=0;
for(let i=0;i<s.length;i++){
//indexOf函数,如果arr中没有s[i],返回-1。 如果有,返回第一个与s[i]相同的下标
let index=arr.indexOf(s[i]);
if(index !== -1){
//进入则说明滑动窗口中有当前s[i],删除第一个重复字符以及之前的所有字符
//splice函数从0开始删除index+1个字符
arr.splice(0,index+1);
}
arr.push(s[i]);
max=Math.max(arr.length,max);
}
return max;
};
方法二 使用下标实现滑动窗口
1.循环遍历字符串s,使用两个下标之间的距离作为滑动窗口
2.截取从i到j之间的字符,判断当前字符s[j]是否在截取字符串中
- 不在,就计算当前长度,j到i字符个数
- 在,就i移动到与s[j] 相同字符的后一个字符上
var lengthOfLongestSubstring = function (s) {
let index = 0,max=0;
for(let i=0,j=0;j<s.length;j++){
//substring函数 截取从i到j的字符
index =s.substring(i,j).indexOf(s[j]);
if(index !==-1){
i=i+index+1
}
max=Math.max(max,j-i+1);
}
return max;
};
两种方法思路差不多,有时间把图补上