美文网首页
leetCode-03 《无重复字符的最长子串》详细解析

leetCode-03 《无重复字符的最长子串》详细解析

作者: TouchMe丶 | 来源:发表于2020-11-02 01:47 被阅读0次

无重复字符的最长子串

描述

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度

示例1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例2
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例3
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

条件

/**
 * @param {string} s
 * @return {number}
 */

思路

滑动窗口法:(思路如图)


思路图
  1. 首先定义一个数组arr作为窗口,max作为最大长度的值。
let max = 0
let arr = []
  1. 遍历字符串的每个值,然后把值加到arr数组中。
for (let i = 0; i < str.length; i++) {
  arr.push(str[i])
}
  1. 然后再加上判断字符是否存在的逻辑,如果存在,则就删除数组中之前的这个字符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])
}
  1. 最后比较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
}

相关文章

网友评论

      本文标题:leetCode-03 《无重复字符的最长子串》详细解析

      本文链接:https://www.haomeiwen.com/subject/swdpvktx.html