「双指针」leetcode 3.无重复字符的最长子串(中等)

552 阅读2分钟

这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

附上原题链接:3. 无重复字符的最长子串

一、了解题目

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

示例:

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

二、题解分析

(1)解题思路

  • 先找出所有不包含重复字符的子串;
  • 找出长度最大的那个子串,返回其长度即可。

(2)解题步骤

  • 用双指针维护一个滑动窗口,用来剪切子串;
  • 不断移动右指针,遇到重复字符的,就把左指针移动到重复字符的下一位;
  • 在移动的过程中,记录所有窗口的长度,并返回最大值。

三、代码实现

依据上面的题解,我们将用 js 来实现这道题。具体实现代码如下:

/**
 * 
 * @param {String} s 
 * @returns number
 */
 let lengthOfLongestSubstring = function(s){
    // 1.定义一个左指针l
    let l = 0;
    // 2.定义res,用来存放最大值
    let res = 0;
    // 3.定义一个字典
    const map = new Map();
    // 4.定义一个右指针,并不断滑动右指针
    for(let r = 0; r < s.length; r++){
        // 4.2 当在字典中遇到与当前索引所对应的值相等时
        // map.get(r) >= l 确保下标在左指针右边
        if(map.has(s[r]) && map.get(s[r]) >= l){
            // 4.2.1 左指针指向原来右指针位置的下一个位置
            l = map.get(s[r]) + 1;
        }
        // 4.3 比较原来的最大值和res值,看看两个值哪个更大
        res = Math.max(res, r - l + 1);
        // 4.1 将当前下标的值及下标存放到字典中
        map.set(s[r], r);
    }
    // 5.返回最终结果
    return res;
}
​
console.log(lengthOfLongestSubstring('ssdfsf'));

以上就是关于无重复字符的最长子串的题解,不知道对小伙伴们是否有帮助呢?

我们下期见👋👋👋