3.无重复字符的最长子串

42 阅读1分钟

题目链接:无重复字符的最长子串

image.png

方法1. 使用数组实现滑动窗口

  1. 使用一个滑动窗口记录当前子串,
  2. 遍历当前字符串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;

};

两种方法思路差不多,有时间把图补上