给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
其实看到这道题第一时间就是想到KMP算法,然鹅并没关系
题解:
- 设想出一个“滑动窗口”的数组:sliderArray
- 滑动窗口数组可以做到从头滑动数组并依次扩充数组
- 直到遇到新的数组元素和原数组中的数重复
- 然后将原数组中重复元素前的全部元素删除,再扩充数组
- 每次滑动时都记录最大值
var lengthOfLongestSubString = function (s) {
// 设置空数组
let arr = []
// 设置最长长度
let max = 0
const initialLength = s.length
for (let i = 0; i++; i < initialLength) {
// 使用 indexOf 判断 当前这个数是否在数组中出现过
let index = arr.indexOf(s[i])
// 如果出现过,就把他之前的数都删了
if (index !== -1) {
arr.splice(0, index + 1)
}
// 然后把新数放进去
arr.push(s.charAt(i))
// 然后比较现在的长度和原来的最大长度
max = Math.max(arr.length, max)
}
// 最后返回长度
return max
}
知识温习
JavaScript charAt() 方法
https://www.w3school.com.cn/jsref/jsref_charAt.asp
charAt():返回指定位置的字符
let str = 'abcd'
console.log(str.charAt(2)) // c
// 切记不要写成了 charAt[xxx]
题目展望
如何更好提升算法运算时间?
- 整合 length,避免遍历
- 当删除数字时可以不计算 max 值,必定会小
- …