无重复字符的最长子串
描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度
示例1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例2
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例3
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
条件
/**
* @param {string} s
* @return {number}
*/
思路
滑动窗口法:(思路如图)
思路图
- 首先定义一个数组arr作为窗口,max作为最大长度的值。
let max = 0
let arr = []
- 遍历字符串的每个值,然后把值加到arr数组中。
for (let i = 0; i < str.length; i++) {
arr.push(str[i])
}
- 然后再加上判断字符是否存在的逻辑,如果存在,则就删除数组中之前的这个字符N,以及N之前的所有字符。
这里用splice方法,因为splice方法可以改变原有数组。
for (let i = 0; i < str.length; i++) {
let index = arr.indexOf(str[i])
if (index !== -1) { // 存在
arr.splice(0, index + 1) // index + 1 数组从0开始删除 index(下标) + 1 个元素
}
arr.push(str[i])
}
- 最后比较max值和此时数组arr的length的大小,取大。
for (let i = 0; i < str.length; i++) {
let index = arr.indexOf(str[i])
if (index !== -1) { // 存在
arr.splice(0, index + 1) // index + 1 数组从0开始删除 index(下标) + 1 个元素
}
arr.push(str[i])
max = Math.max(arr.length, max)
}
最终代码
const lengthOfLongestSubstring = (str) => {
let max = 0
let arr = []
for (let i = 0; i < str.length; i++) {
let index = arr.indexOf(str[i])
if (index !== -1) { // 存在
arr.splice(0, index + 1) // index + 1 数组从0开始删除 index(下标) + 1 个元素
}
arr.push(str[i])
max = Math.max(arr.length, max)
}
return max
}
网友评论