给出由小写字母组成的字符串 S
,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:"abbaca" 输出:"ca" 解释: 例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
提示:
1 <= S.length <= 20000
S
仅由小写英文字母组成。
思路:这道题要消除字符串中相邻的两个重复字母,也就是遍历到某个字母的时候,我们需要判断前一个字母是否和它相同,暴力模拟感觉可以,但非常麻烦,当数据量一大估计会超时。
这道题其实和括号匹配那题很像,如果没有做过的可以通过下面的链接去做一下。
还是可以借助栈来完成,遍历到某个元素的时候,如果栈中为空,说明其前面没有元素,它是首个元素,或者他前面的元素都两两消除了,那就直接入栈;若栈不为空,说明栈内的元素都是无法两两消除的,那就检查栈顶元素是否能和它消除,若可以消除,那就弹出栈顶元素,若不能消除,注意得将栈顶元素及时加回来,再把这个元素加进来,进行下一个元素的检查。
20.有效的括号
leetcode链接:. - 力扣(LeetCode)
题解链接:CSDN
代码(Python):
class Solution(object):
def removeDuplicates(self, s):
result = []
for i,str in enumerate(s):
if len(result)>0: #如果栈中不为空
t = result.pop()
if t == str: #若该元素和栈顶元素相同,则可以消除
continue;
else:
result.append(t)
result.append(str)
else: #如果栈中为空,直接加入
result.append(str)
res = ''
for i in range(len(result)):
res += result[i]
return res