算法——无重复最长子串长度

滑动窗口法

'abcabcbb'
1、拿出两根手指,左边指向第一位,右边指向它的后一位,进行对比,看是否相同;
2、不同的话,右手往后走一位,再分别与前面的每一位进行对比是否相同,并且每一次都要记录下长度(max = indexright - indexleft + 1);
3、若出现相同的字符串(此时的长度为max = indexright - indexleft,注意有相同项和无相同项max计算式不一样),左手则移到前面这一坨中相同字符串的后面一位,接下来右手再往后移一位,再对左手开始的字符串一一进行对比;
4、每次对比中需要比较max的长度,只有这一次的长度大于上一次长度时,再去给max赋值;

const longStr = (s)=>{
  if(s.length <= 1) return s.length
  
  let max = 0
  //分别声明出左手和右手所指元素下标
  let p1 = 0
  let p2 = 1
  
  //首先要限制右手所指下标不能超过字符串长度
  while(p2 < s.length){
    //相同项字符串下标
    let sameIndex = -1
    for(let i = p1; i < p2; i++){
      if(s[i] === s[p2]){
        sameIndex = i
        break
      }
    }
    
    let tempMax  
    if(sameIndex >= 0){
      //有相同位时,这里一定不要忘记“=”
      //因为sameIndex相当于左手指的那一位出现相同元素的下标啊!!肯定有为0的时候啊!!!
      tempMax = p2 - p1
      //再把左手移到相同项的后一位
      p1 = sameIndex + 1
    }else{
      tempMax = p2 -p1 + 1
    }
    
    //一旦这次对比中长度又长了,就给它赋值给最后的max
    if(tempMax > max){
      max = tempMax
    }
    //最后右手往后移一位
    p2 += 1
  }
  return max
}
console.log(longStr("abcabcbb"))

你可能感兴趣的:(算法——无重复最长子串长度)