可变窗口:最长无重复子串
一、面试常考点
1. 可变窗口核心
当约束被破坏时收缩左边界直到恢复。
2. 数据结构选择
字符计数一般用 Map 或数组。
二、细节介绍
1. 维护频次
右移扩张时频次 +1。
2. 处理冲突
若某字符频次 > 1,不断左移收缩。
三、示例代码
function lengthOfLongestSubstring(s) {
const cnt = new Map()
let left = 0
let ans = 0
for (let right = 0; right < s.length; right++) {
cnt.set(s[right], (cnt.get(s[right]) || 0) + 1)
while (cnt.get(s[right]) > 1) {
cnt.set(s[left], cnt.get(s[left]) - 1)
left++
}
ans = Math.max(ans, right - left + 1)
}
return ans
}
四、常用应用场景
1. 连续行为分析
最长合法连续行为序列。
2. 风控检测
实时窗口内重复/异常模式识别。