ID:3.无重复字符的最长子串

40 阅读1分钟

考点:滑动窗口

题目链接

题目

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

思路

参考思路

简单来说就是有左右两个指针,也即窗口的“边框”,它们括起了一个“窗口”。当窗口内没有重复字符的时候,右边界逐渐自增,当出现重复字符时,左边界一直挪到左边的重复字符的下一个字符位置。那么如何判断出现了重复字符呢?可以使用一个字典,存储每一位的下标。

var lengthOfLongestSubstring = function(s) {
    let maxLen = 0; // 最大长度
    const map = new Map(); // 储存
    let left = 0, right = 0; // 左边界与右边界
    while(right < s.length) { // 右边界没到最大长度
        if(map.has(s[right])) { // 如果发现重复字符
            // 注意!这里要取重复出现过的字符下标和左边界的较大值
            // 要保证左边界一直是增加的
            left = Math.max(map.get(s[right]) + 1, left);
        }
        // 储存右边界的下标
        map.set(s[right], right);
        // 如果当前窗口的长度已经超过最大值,则更新最大值
        if(right - left + 1 > maxLen) maxLen = right - left + 1;
        // 右边界挪一位
        right++;
    }
    return maxLen;
};