题目
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
思路
滑动窗口
- 若给定字符长度小于等于1,直接返回长度
- 创建最大长度变量
max
- 初始化两个类似指针的变量,
p1=0
,p2=1
,值相当于索引。 - 进入while循环,直到
p2
到达给定字符的长度,每次循环p2
后移一位,即p2+=1
- 循环中创建重复元素的下标,变量
sameIndex
,初始化为-1,表示无重复元素 - 遍历
从p1开始到p2之前的所有元素
,若有元素与p2
重复,则记录重复元素的下标,退出循环。 - 创建临时最大长度
tempMax
- 判断有没有重复元素
(sameIndex >= 0 ?)
的情况 - 若有重复元素,则临时最大长度为
p2-p1
,此时要将p1
置于重复元素之后一位(p1 = sameIndex+1)
- 若没有重复元素,则临时最大长度为
p2-p1+1
- 判断
tempMax
与max
的大小情况,是否更新max p2
向后移一位后,进入下次while循环- 返回
max
代码
var lengthOfLongestSubstring = function (s) {
if (s.length <= 1) {
return s.length
}
// 最大长度
let max = 0
// 类似指针1
let p1 = 0
// 类似指针2
let p2 = 1
while (p2 < s.length) {
// 创建重复元素的下标 循环中初始化为-1 表示无重复
let sameIndex = -1
for (let i = p1; i < p2 ; i++) {
// 遍历寻找p2前面有无重复元素
if (s[i] === s[p2]) {
// 记录重复元素的下标 跳出循环
sameIndex = i
break
}
}
// 创建临时最大长度
let tempMax
if (sameIndex >= 0) {
// 有重复元素
tempMax = p2 - p1
p1 = sameIndex + 1
} else {
// 无重复元素
tempMax = p2 - p1 + 1
}
if (tempMax > max) {
max = tempMax
}
p2 += 1
}
return max
}