字符串处理

2026 华为OD机试真题 6月17日华为OD上机新系统考试真题 100 分题型

点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解

题目描述

给定一个字符串 s,以及字符串子串的长度 n,要求:

  1. 把 s 按照 n 的长度进行字符串子串拆分;
  2. 每个子串不允许出现重复的字符,如果出现,则保留最后一个,例如 "aba" 处理后会变成 "ba",因为第一个 'a' 出现重复,因此第一个 'a' 被删除,保留了最后一个 'a';
  3. 字符串 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"

解题思路

本题的关键是 如何高效地保留每个字符的最后一次出现位置

算法步骤:

  1. 将字符串 s 按长度 n 分割成多个子串
  2. 对于每个子串:
    • 记录每个字符最后一次出现的位置(索引)
    • 遍历子串,只保留那些索引等于最后一次出现位置的字符
  3. 将处理后的所有子串拼接起来

去重逻辑:

  • 遍历子串时,用字典记录每个字符最后出现的索引
  • 再次遍历时,只保留 当前位置 == 该字符最后出现位置 的字符

为什么这样有效?

  • "aba" -> last = {'a':2, 'b':1} -> 遍历[0,1,2],保留索引为1,2的字符 -> "ba"

复杂度分析

  • 时间复杂度:O(s),s 为字符串长度,每个字符最多遍历两次
  • 空间复杂度:O(n),存储字符最后出现
THE END