算法——無重復最長子串長度

滑動窗口法

'abcabcbb'
1、拿出兩根手指,左邊指向第一位,右邊指向它的后一位,進行對比,看是否相同;
2、不同的話,右手往后走一位,再分別與前面的每一位進行對比是否相同,并且每一次都要記錄下長度(max = indexright - indexleft + 1);
3、若出現(xiàn)相同的字符串(此時的長度為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相當于左手指的那一位出現(xiàn)相同元素的下標?。?!肯定有為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"))
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容