滑动窗口法
'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"))
网友评论