华为 · 栈 · 算法编程题
华为 n ≤ 200000 时限 1 秒 / 256 MB

题目描述

小红维护一个初始为空的字符串,需要依次执行追加、删除、撤销和重做操作。`APPEND s` 在末尾追加字符串;`POP` 删除末尾一个字符;`UNDO` 撤销最近一次尚未撤销的有效编辑;`REDO` 重做最近一次被撤销且尚未重做的编辑。
空串上的 `POP`、没有历史时的 `UNDO` 或 `REDO` 均无效果。执行一次有效的 `APPEND` 或 `POP` 后,重做记录会被清空;无效操作不会清空。

输入输出

输入描述
第一行输入操作数 n 。接下来 n 行每行一个操作。
保证 1 ≤ n ≤ 2× 10^5 ,所有 `APPEND` 的字符串总长度不超过 2× 10^5 ,追加串只含可见非空白 ASCII 字符。
输出描述
输出最终字符串;若为空则输出一个空行。

样例共 2 组

样例 1 · 撤销追加 d 后,新的 POP 清空重做记录,因此最后的 REDO 无效果。
输入
5
APPEND abc
APPEND d
UNDO
POP
REDO
输出
ab
样例 2 · 两次撤销后再依次重做追加和删除。
输入
6
APPEND abc
POP
UNDO
UNDO
REDO
REDO
输出
ab

算法解析依据充分

考点:栈

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

题目画像

  • 数据规模:n ≤ 200000
  • 复杂度门槛:只允许 O(n) 或 O(n log n),且常数要小(注意读入效率)。
  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:栈

本题切入点

编辑器用两个栈实现撤销/重做:一个栈存已执行编辑、另一个存被撤销的编辑;有效编辑后清空重做栈,UNDO/REDO 在栈间搬运,同时维护当前字符串。

后进先出的结构天然适合处理嵌套、匹配与「最近的更大/更小」问题。

思路框架(栈 通法 · 非本题专属)

  1. 括号匹配:遇左括号入栈,遇右括号检查栈顶是否配对。
  2. 单调栈:从左到右扫,维持栈内单调,遇到破坏单调性的元素就弹栈并结算答案。
  3. 每个元素最多进出栈各一次,总复杂度 O(n)。

实现要点:Python 用 list 当栈(append/pop);判断栈空再取栈顶。

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

该范式的通法易错点

  • 栈空时取栈顶。
  • 弹栈时机的判断条件写反。

对照本题

  • 数据规模 n ≤ 200000,只允许 O(n) 或 O(n log n),且常数要小(注意读入效率)。

样例解读

样例 1:输入 5 / APPEND abc / APPEND d / UNDO / POP / REDO → 输出 ab

撤销追加 d 后,新的 POP 清空重做记录,因此最后的 REDO 无效果。

样例 2:输入 6 / APPEND abc / POP / UNDO / UNDO / REDO / REDO → 输出 ab

两次撤销后再依次重做追加和删除。

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

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

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