华为 · 滑动窗口 · 算法编程题
华为 滑动窗口 n ≤ 10000000 时限 1 秒 / 256 MB

题目描述

在网络安全日志分析系统中,每台服务器每秒会产生一条由字母和数字组成的事件编码。安全分析师发现,当连续一段时间内的事件编码序列中没有出现重复的编码字符时,这段时间内的日志可以被认为是"独立事件窗口",有助于精确定位异常行为。窗口越长,说明系统在该时段内产生的事件种类越丰富,分析价值越高。
现在给你一条完整的事件编码序列 s,请你找到其中最长的一段连续子序列,使得这段子序列中每个字符都不相同,并输出该子序列的长度。

输入输出

输入描述
一行,一个字符串 s,仅由 ASCII 字母和数字组成,不含空格。字符串长度为 n (1 <= n <= 10^7)。
输出描述
一个整数,表示 s 中最长的不含重复字符的连续子串的长度。

样例共 2 组

样例 1 · 最长的无重复字符子串为 "abxY3c"(从第4个字符到第9个字符),长度为6。其中每个字符 a, b, x, Y, 3, c 都只出现了一次。
输入
xY3abxY3c
输出
6
样例 2 · 所有字符都相同,任意长度大于1的子串都包含重复字符,因此最长无重复子串长度为1。
输入
aaaaaaa
输出
1

算法解析依据充分

考点:滑动窗口

数据规模 n ≤ 10000000 | 限制 1 秒 / 256MB | 标准输入输出

题目画像

  • 数据规模:n ≤ 10000000
  • 复杂度门槛:只允许 O(n):n 到千万量级时线性做法仍可行,但读入效率与常数要压紧;O(n log n) 在此量级已偏紧。
  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:滑动窗口

本题切入点

最长无重复字符子串:滑动窗口 + 记录每个字符最近出现位置,右指针扩张、左指针仅在冲突时跳到 last[c]+1,O(n) 可扛 1e7 长度。

维护一个连续区间,进一个元素出一个元素,区间内统计量增量更新。

思路框架(滑动窗口 通法 · 非本题专属)

  1. 用左右指针确定一个窗口 [l, r]。
  2. 右端点右移:把新元素加入窗口统计。
  3. 当窗口违反约束(长度超限 / 含重复等)时,左端点右移,把元素移出统计。
  4. 在每个合法窗口上更新答案。
  5. 统计量用哈希表或计数数组维护,避免每次重算。

实现要点:注意窗口长度是定长还是不定长:定长则区间长度固定为 k,不定长则靠条件收缩。

复杂度:时间 O(n) | 空间 O(字符集/去重元素数)

该范式的通法易错点

  • 移出窗口时忘同步更新统计量。
  • 窗口长度与下标边界差 1(长度 k 对应 r-l+1)。

对照本题

  • 数据规模 n ≤ 10000000,只允许 O(n):n 到千万量级时线性做法仍可行,但读入效率与常数要压紧;O(n log n) 在此量级已偏紧。

样例解读

样例 1:输入 xY3abxY3c → 输出 6

最长的无重复字符子串为 "abxY3c"(从第4个字符到第9个字符),长度为6。其中每个字符 a, b, x, Y, 3, c 都只出现了一次。

样例 2:输入 aaaaaaa → 输出 1

所有字符都相同,任意长度大于1的子串都包含重复字符,因此最长无重复子串长度为1。

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:2026年-华为-1月21号AI岗。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解