https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/
解题思路
利用栈
遍历字符串中的所有字符
如果栈为空,直接入栈
否则判断该字符是否与栈顶元素相同
如果两字符相同,删除栈顶元素
如果两字符不同,将当前字符入栈
最后留下的栈内字符都是相邻不重复的字符
由于Deque是双向队列,可以从队尾弹出字符,并添加到StringBuffer对象中.最终将StringBuffer通过toString()方法返回字符串
代码(Deque作栈)
class Solution {
public String removeDuplicates(String s) {
int len = s.length();
StringBuffer sb = new StringBuffer();//存放结果的字符数组
//LinkedList:基于链表实现的链表双向队列,在这里用作栈
Deque<Character> stack = new LinkedList<>();
//遍历 s
for(int i=0; i<len; i++){
char c = s.charAt(i);
if(stack.peekFirst() == null || stack.peekFirst() != c){//获取栈顶元素(不删除)与c比较
stack.addFirst(c);//不同字符则继续添在栈顶加字符
}else if(stack.peekFirst() == c){//相同字符则取出栈顶元素
stack.removeFirst();
}
}
//从后往前拿出来添加到StringBuffer对象中
while(stack.peekLast() != null){
sb.append(stack.removeLast());
}
return sb.toString();
}
}
自己瞎编的好像提交结果没有那么理想
继续改
解题思路
直接用StringBuffer对象作栈,省去Deque栈到StringBuffer对象的转换过程
代码(StringBuffer作栈)
class Solution {
public String removeDuplicates(String s) {
int len = s.length();
//拿字符串直接作为栈,省去了栈还要转为字符串的操作
StringBuffer sb = new StringBuffer();
//top作为sb的长度
int top = -1;
//遍历 s
for(int i=0; i<len; i++){
char c = s.charAt(i);
//栈为空 或者 栈顶元素与字符不等 :则添加到栈中,top++
if(top == -1 || sb.charAt(top) != c){
sb.append(c);
top++;
//栈不为空且 栈顶元素与字符相等,则删除栈顶字符,top--
}else if(top >= 0 && sb.charAt(top) == c){
sb.deleteCharAt(top);
top--;
}
}
return sb.toString();
}
}
貌似好了点儿