JS算法-字符串中无重复字符的最长子串

485 阅读1分钟

本题题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。本题选自leetcode第 3 题

无重复字符的最长子串的长度

示例 1:

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

示例2:

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

示例3:

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

示例 4:

输入: s = ""
输出: 0

解题方法

本方法通过前后双指针来限定当前内容是不重复的,并且每次都会判断是否需要最新开始值,根据后指针的位置 - 前指针的位置 + 1,并且跟当前的最大值进行比较,来得出最终的结果。

function lengthOfLongestSubstring(str) {
    if (str === "") return 0;
    let start = 0, maxLen = 0;
    const map = new Map();
    const len = str.length;
    for(let i = 0; i < len; i++) {
        const c = str[i];
        if (map.has(c)) {
            start = Math.max(map.get(c) + 1, start)
        }
        map.set(c, i);
        maxLen = Math.max(i - start + 1, maxLen);
    }
    return maxLen;
}

截屏2021-04-26下午4.31.33.png

无重复字符的最长子串

试着修改一下本题,找到无重复字符的最长子串有哪些,目前先考虑只有一个最长子串的情况。

function lengthOfLongestSubstring(str) {
    if (str === "") return null;
    let start = 0, maxLen = 0, resStr = null;
    const map = new Map();
    const len = str.length;
    for(let i = 0; i < len; i++) {
        const c = str[i];
        if (map.has(c)) {
            start = Math.max(map.get(c) + 1, start);
        }
        map.set(c, i);
        // 当前差值大于maxLen的时候记录下来子串
        if (i - start + 1 > maxLen) {
            resStr = str.slice(start, i + 1);
        }
        maxLen = Math.max(i - start + 1, maxLen);
    }
    return resStr;
}

总结

目前感觉这种方法还是比较方便的。