返回首页

可变窗口:最长无重复子串

一、面试常考点

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. 风控检测

实时窗口内重复/异常模式识别。