力扣HOT100—无重复最长字串

61 阅读2分钟

算法每日一更,记录我的成长。

今天也是巨累的一天,最近项目组在重构一个即时通讯项目,疯狂学习 uniapp 相关的东西。后面我会分享几个我踩过的坑。

那么,进入主题,今天我们带来的是力扣HOT100的找出无重复的最长字串(滑动窗口)

上题目~:

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

示例 1:

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

示例 2:

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

示例 3:

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

这个题目的意思很好理解,不像其他题目,读题都读了半天。这里就不对题目意思进行拆解了,只需要注意两个条件:

  1. 最长的字串
  2. 字串必须是连续的

思路:

  • 维护从下标 left 到下标 right 的字符
  • 我们使用一个set集合来记录每个字符最后出现的位置,方便我们在遇到重复字符时,调整左边界 left。
  • 每次移动右指针 rigth 时,我们检查当前字符是否已经出现在窗口中。如果出现过,就移动左指针 left 到重复字符的下一个位置,保证窗口内没有重复字符。
  • 最终,窗口的大小就是当前无重复字符子串的长度,我们用 res 变量记录最大长度。

上代码

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    let rigth = 0
    let ans = 0
    let window = new Set()
    for(let rigth = 0;rigth<s.length;right++) {
        let cur = s[right]
        while(window.has(cur)) {
            window.delete(cur)
            left++
        }
        window.add(cur)
        ans = Math.max(ans, right - left + 1)
    }
    return 
};

代码比较简单,主要理解滑动窗口的含义。

最后我们提交代码,运行看结果。

image.png

启动!

image.png