题目描述
给出由小写字母组成的字符串s,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在s上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:"abbaca" 输出:"ca" 解释: 例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。提示:
1 <= s.length <= 105s仅由小写英文字母组成。
解题思路
与20.有效的括号类似,匹配即将进栈的元素与栈顶元素即可。
代码
classSolution{publicStringremoveDuplicates(Strings){// 转换成字符数组char[]array=s.toCharArray();// 使用双端队列存储Deque<Character>deque=newLinkedList<>();for(charch:array){// 队列非空时检查栈顶元素if(!deque.isEmpty()&&ch==deque.peek()){// 匹配则出栈deque.pop();}else{// 未匹配则压栈deque.push(ch);}}// 用新字符数组输出char[]result=newchar[deque.size()];for(inti=result.length-1;i>=0;i--){result[i]=deque.peek();deque.pop();}returnnewString(result);}}