华为 · 字符串 · 算法编程题
华为 字符串 时限 1 秒 / 256 MB

题目描述

给定一个字符串,小红想判断它能否由某个更短的非空字符串重复至少两次得到。若可以,输出长度最短的重复段,紧接着输出重复次数;否则原样输出字符串。

输入输出

输入描述
输入一个仅含数字和大小写英文字母的字符串 s , 1≤|s|≤5×10^5 。
输出描述
若存在最短重复段 t 且 s 由 t 重复 k≥2 次得到,输出 `t` 后紧跟十进制整数 `k`;否则输出原串。

样例共 2 组

样例 1 · 不存在重复至少两次的更短循环段。
输入
aaabbb
输出
aaabbb
样例 2 · 最短循环段是 abc,共重复 3 次。
输入
abcabcabc
输出
abc3

算法解析依据充分

考点:字符串

限制 1 秒 / 256MB | 标准输入输出

题目画像

  • 元素值域:s ≤ 500000(注意整数类型选择,避免溢出)
  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:字符串

本题切入点

判断最小循环节:求前缀函数(next 数组),若 n 能被 n−next[n−1] 整除则该长度即最小循环节、重复次数为 n/该长度;否则原样输出。

按字符逐个处理,或利用字符串的前后缀性质加速匹配。

思路框架(字符串 通法 · 非本题专属)

  1. 明确操作对象是字符还是子串、是否需要保持原顺序。
  2. 子串问题常用双指针 / 滑动窗口;回文问题可用中心扩展或哈希。
  3. 多模式匹配考虑 Trie 或 KMP;只需计数则用哈希表统计字符频次。
  4. 注意字符集大小写敏感性与输入是否带引号。

实现要点:Python 切片 s[l:r+1] 取子串;注意字符串不可变,频繁拼接改用 list。

复杂度:时间 O(n) ~ O(n²) | 空间 O(n)

该范式的通法易错点

  • 下标与切片边界差 1。
  • 忽略了大小写、空白字符的影响。

对照本题

  • 元素值域最大到 500000 —— 求和 / 相乘时记得开 64 位整数。

样例解读

样例 1:输入 aaabbb → 输出 aaabbb

不存在重复至少两次的更短循环段。

样例 2:输入 abcabcabc → 输出 abc3

最短循环段是 abc,共重复 3 次。

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

本题来源:2026年-华为-07月01号开发岗。

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