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

37 篇文章 0 订阅
19 篇文章 0 订阅

重复子串问题,滑动窗口求解,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的知识笔记,欢迎交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值