题目
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:"abbaca"输出:"ca"解释:例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
提示:
1 <= S.length <= 20000S仅由小写英文字母组成。
题解
首先是最暴力的方法,直接模拟:
class Solution(object):def removeDuplicates(self, S):i = 0while i < len(S)-1:if S[i] == S[i+1]:S = S[:i]+S[i+2:]i = max(0, i-1)else:i += 1return S
该程序排名 25%, 因为里面有很多字符串的合并操作,这是非常消耗时间的。
所以我们考虑用链表来模拟,如果 S[i] == S[Next[i]],那么立刻将 i 的前一个元素指向 i 的后两个元素 Next[last_i] = Next[Next[i]]。
为了减少边界情况的考虑,我们可以加一个哨兵节点:S='0'+S ,这样 S[0] 就成为了永远存在的表头。
class Solution(object):def removeDuplicates(self, S):i = 0S = '0'+SNext = list(range(1, len(S)+1))Next[-1] = -1Last = []while Next[i] >= 0:if S[i] == S[Next[i]]:last_i = Last.pop()Next[last_i] = Next[Next[i]]i = last_ielse:Last.append(i)i = Next[i]i = 0L = []while i >= 0:L.append(S[i])i = Next[i]return ''.join(L[1:])
执行用时:92 ms, 在所有 Python 提交中击败了32.92%的用户 内存消耗:14.4 MB, 在所有 Python 提交中击败了5.40%的用户
但是结果居然排在 33%,这不是简单题么?
瞟了一眼题解,瞬间恍然大悟,是自己想复杂了,直接用栈就OK了
class Solution(object):def removeDuplicates(self, S):L = []for s in S:if L and L[-1] == s:L.pop()else:L.append(s)return ''.join(L)
