字符串处理
2026 华为OD机试真题 6月17日华为OD上机新系统考试真题 100 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
题目描述
给定一个字符串 s,以及字符串子串的长度 n,要求:
- 把 s 按照 n 的长度进行字符串子串拆分;
- 每个子串不允许出现重复的字符,如果出现,则保留最后一个,例如 "aba" 处理后会变成 "ba",因为第一个 'a' 出现重复,因此第一个 'a' 被删除,保留了最后一个 'a';
- 字符串 s 的长度不一定恰好是 n 的倍数,最后一个数据包可能少于 n 个字符,但处理规则不变;
最后把所有子串再次拼接,输出一个新的字符串。
2026 华为OD机试真题 6月17日华为OD上机新系统考试真题 100 分题型
输入描述
- 第一行输入一个字符串 s,字符串不为空且仅包含小写字母,长度不超过 1000。
- 第二行输入一个整数 n (1≤n≤1000),表示子串的长度。
输出描述
- 输出一个字符串,表示处理后的新的字符串。
示例1
输入
abaabacbda,3
输出
babacbda
说明
原始字符串分成 4 个子串: "aba"、"aba"、"cbd"、"a"。
- "aba" 处理为 "ba"
- "aba" 处理为 "ba"
- "cbd" 处理为 "cbd"
- "a" 处理为 "a" 拼接得到 "ba" + "ba" + "cbd" + "a" = "babacbda"。
示例2
输入
aaabbb,2
输出
aabb
说明
原始字符串分成 3 个子串: "aa"、"ab"、"bb"。
- "aa" 处理为 "a"
- "ab" 处理为 "ab"
- "bb" 处理为 "b"拼接得到"a"+"ab"+"b"="aabb$"。
示例3
输入
a,1
输出
a
说明
只有 1 个字符,结果为 "a"
示例4
输入
a,1000
输出
a
说明
只有 1 个字符,结果为 "a"
解题思路
本题的关键是 如何高效地保留每个字符的最后一次出现位置。
算法步骤:
- 将字符串 s 按长度 n 分割成多个子串
- 对于每个子串:
- 记录每个字符最后一次出现的位置(索引)
- 遍历子串,只保留那些索引等于最后一次出现位置的字符
- 将处理后的所有子串拼接起来
去重逻辑:
- 遍历子串时,用字典记录每个字符最后出现的索引
- 再次遍历时,只保留
当前位置 == 该字符最后出现位置的字符
为什么这样有效?
- "aba" -> last = {'a':2, 'b':1} -> 遍历[0,1,2],保留索引为1,2的字符 -> "ba"
复杂度分析
- 时间复杂度:O(s),s 为字符串长度,每个字符最多遍历两次
- 空间复杂度:O(n),存储字符最后出现
版权声明:
作者:魔改工程师
链接:https://www.sylblog.xin/archives/666
文章版权归作者所有,未经允许请勿转载。
THE END