解题思路
本题需要模拟一个支持撤销和重做的文本编辑器。核心在于:只需要记录每一次真正改变文本的操作,并在撤销或重做时执行对应的反向操作或原操作。
维护三个结构:
text:当前文本内容,可以用字符数组或字符串模拟栈,方便在末尾插入和删除。
undo:已经执行过、可以被撤销的操作记录。
redo:已经被撤销、可以被重做的操作记录。
P5117.第2题-迷你文本编辑器的撤销与重做功能
题目内容
设计一个迷你文本编辑器,支持以下 4 种操作:
- APPEND x:在文本末尾插入字符串 x(x 可以是一个或多个字符的连续字符串,无空格和换行)。
- POP:删除文本末尾最后一个字符,如果文本为空,此操作无效果,不进入 UNDO、REDO 历史记录。
- UNDO:撤销上一次 APPEND 或 POP 操作,并恢复文本到该操作之前的状态,可以连续多次撤销多个操作,直至无操作可撤销。
- REDO:重做上一次被撤销的操作,使文本恢复到撤销前的状态。可以连续多次重做,直至无操作可重做。若在撤销某些操作前执行了新的 APPEND 或 POP ,则之前的操作记录将被清空。
初始时文本为空。给定一系列操作,按顺序对文本执行,最终输出文本的内容。
输入描述
第一行输入一个正整数 N,表示操作的数量。接下来 N 行,每行表示一个操作,格式如下:
- APPEND x 表示在文本末尾插入字符串 x,其中 x 由大小写字母、数字或符号组成(不含空格和换行)。
- POP 表示删除文本末尾最后一个字符。
- UNDO 表示撤销上一次插入或删除操作。
- REDO 表示重做上一次被撤销的操作。
注意:
- 1≤N≤200000,确保操作数量在合理范围内。
- 单次插入的字符串长度不超过 100,且所有插入操作的字符总数之和不会超过 200000。
- 操作序列保证合法:UNDO 操作不超过可撤销的次数, REDO 操作不超过可重做的次数。
输出描述
输出一个字符串,表示所有操作执行完毕后的文本内容(若最终文本为空,则输出 nothing)。
样例1
输入
5
APPEND abc
APPEND d
UNDO
POP
REDO
输出
ab
说明
"abc"−>"abcd"−>"abc"−>"ab"−>"ab"
在撤销某些操作后执行了新的 APPEND 或 POP,则之前撤销的操作记录将被清空,无法再重做。
样例2
输入
5
APPEND ab
UNDO
REDO
UNDO
REDO
输出
ab
说明
"ab"−>""−>"ab"−>""−>"ab"