重复子串问题,滑动窗口求解,js实现

重复子串问题,滑动窗口求解,js实现

  • 描述
  • 算法思路
  • 算法代码

描述

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

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

示例2:

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

示例3:

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

算法思路

采用滑动窗口方法

  1. 定义左右指针
  2. 开始的时候,左右指针位置一样,右指针向右移动,记录遍历过的字符位置
  3. 直到遇到已经遍历过的,且目前已存在的位置大于或等于左指针位置,然后将起点位置设置到目前存在的字符下标后一位
  4. 然后继续遍历,直到结束,获取最长的长度即为结果
  5. 子串abcabcbb遍历过程如下
  6. abc 第四个a,相同,记录目前的长度 7. 因此将左指针start移动到map中的a的下标值后一位,右指针继续遍历,直到循环结果

算法代码

var lengthOfLongestSubstring = function(s) {
    let start = 0, len = 0;
    const map = new Map();
    for (let end = 0; end < s.length; end++) {
        const char = s[end];
        // 如果map对象中存在该字符,且该下标大于等于目前的左指针,则移动左指针
        if (map.has(char) && map.get(char) >= start) {
            start = map.get(char) + 1;
        }
        // 将遍历过的字符传入map对象
        map.set(char, end)
        // 记录每一次处理的长度
        len = Math.max(len, end - start + 1);
    }
    return len;
};

PS:该文是对leetcode的知识笔记,欢迎交流

你可能感兴趣的:(JavaScript,算法类,编程类,javascript,算法,leetcode)