题目
给定一个字符串 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
}