滑動窗口法
'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"))