美文网首页
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