面试常见算法题 —— 无重复字符的最长子串

84 阅读1分钟

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

  示例 1:

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

示例 2:

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

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

首先,面对此题我们应该首先想到应用滑动窗口来计算没有重复字符的字串的长度,用哈希结构存储滑动窗口中每个字符最后出现的索引位置。当滑动窗口右侧新 count 记录字串的最大值,当窗口内长度大于count时,更新count。 具体代码实现如下(javascript):

var lengthOfLongestSubstring = function(s) {
    let l = -1
    let count = 0 
    let map = new Map()
    for(let i = 0 ; i < s.length ; i++){
        if(map.has(s[i])){
            l = Math.max(l,map.get(s[i]))
            map.set(s[i],i)
        }else{
            map.set(s[i],i)
        }
        count = Math.max(count,i-l)
    }
    return count

};

注意事项:

  • 若查找哈希表有重复字符需要更新滑动窗口左侧的指针时,不可盲目改为哈希表已存储的下标,应该确保该存储结果大于左指针才需修改。否则类似此样例"abba"会出错
  • 为用滑动窗口长度记录子串长度,左指针应该从-1位置开始

力扣链接:无重复的最长子串