描述
原题在这: https://www.hackerrank.com/challenges/reverse-shuffle-merge/problem
大意是定义了几个操作, reverse
, permutation(shuffle)
, 然后给你merge(reverse(s), permutation(s))
的结果, 问可能的最小字典序的原始字符串是什么.
思路
标准单调栈. 逆序处理(因为有reverse就再reverse一下, 反正permutation不受逆序影响). 当前值比栈顶小的时候, 不能直接pop, 还需要满足
- 对于栈顶字符
res[-1]
, 剩余未处理的字符串中res[-1]
的数量 + 栈中res[-1]
数量减1
(即将pop出) 需要大于总数量的一半. (这样res[-1]
才够用, 来形成结果) - 既然
res[-1]
是要被当前字符c
替换掉的, 目前栈中的c
数量必须小于总数量一半, 不可以超过.
代码
1 | import collections |