算法每日一更,记录我的成长。
今天也是巨累的一天,最近项目组在重构一个即时通讯项目,疯狂学习 uniapp 相关的东西。后面我会分享几个我踩过的坑。
那么,进入主题,今天我们带来的是力扣HOT100的找出无重复的最长字串(滑动窗口)
上题目~:
给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列, 不是子串。
这个题目的意思很好理解,不像其他题目,读题都读了半天。这里就不对题目意思进行拆解了,只需要注意两个条件:
- 最长的字串
- 字串必须是连续的
思路:
- 维护从下标 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
};
代码比较简单,主要理解滑动窗口的含义。
最后我们提交代码,运行看结果。
启动!