您正在寻找一条大道,有人把垃圾扔掉了!您需要编写一个程序来帮助解决此问题,方法是将垃圾放入垃圾桶。
任务
途径由一串可打印的ASCII字符组成,例如:
[[](dust)[]] car ((paper)vomit) (broken(glass)) [[] (rotten) fence (dirty)
这里的某些括号是无法比拟的;这些只是诱饵。我们关心的是匹配的括号。
一个垃圾桶是一个字符串开头[
和结尾]
,并与内部匹配括号和括号。例如,[]
和[[](dust)[]]
是上面字符串中的垃圾桶。
一个垃圾袋是一个字符串开头(
和结尾)
,并与内部匹配括号和括号。例如,(dust)
上面的字符串中是垃圾袋。
有些垃圾袋可能已经在垃圾桶中了。但是,至少将一个人遗漏在外,我们需要移动垃圾袋,以便它们全部位于垃圾桶中。具体来说,对于当前不在垃圾桶内的每个垃圾袋(即该垃圾桶的子串),我们需要将其从字符串中的当前位置移除,然后插入到垃圾桶内的位置。
这里还有一条附加规则。因为我们不想在垃圾收集器上花费太多的钱,并且它们的路线将它们沿着从右到左的方向走,所以我们想将每个垃圾袋向左移动(最重要的标准,假设我们必须将其移动到全部)和最短距离(只要将其向左移动)。因此,例如,唯一正确的输出
[can1](bag)[can2]
是
[can1(bag)][can2]
(将包仅向左移动一个字符)。此外,袋子必须保持相同的相对顺序:
[can](bag1)(bag2)
必须成为
[can(bag1)(bag2)]
(即,您不能放在(bag2)
的左侧(bag1)
。)
澄清说明
- 最左边的垃圾箱的左边没有任何垃圾袋。始终可以通过将其向左移动来清除所有垃圾。
- 总会有至少一个袋子可以移动。可能不止一个。
- 垃圾袋内永远不会有垃圾桶(罐子太贵了而不能扔掉)。
- 如果罐子里已经有袋子,那就别管它了。
- 输入和输出的尾随空格(包括换行符)也可以不同。
例子:
输入:
[[](dust)[]] car ((paper)vomit) (broken(glass)) [[] (rotten) fence (dirty)
输出:
[[](dust)[]((paper)vomit)(broken(glass))] car [[(rotten)(dirty)] fence
输入:
[]] (unusable) door (filthy) car
输出:
[(unusable)(filthy)]] door car