一、题目
演示示例:
二、测试代码
//方法一 栈和ArrayList
class Solution {
public String removeDuplicates(String S) {
Stack<Character> stack=new Stack<>();
String str="";
List<Character> list=new ArrayList<>();
for(char c:S.toCharArray()){//遍历字符串
if(stack.isEmpty()){//若为空栈字符直接入栈
stack.push(c);
}else{
if(stack.peek()==c){//若不为空栈且栈顶字符与遍历字符相等则将栈顶字符弹出,若不相等将字符入栈
stack.pop();
}else{
stack.push(c);
}
}
}
while(!stack.isEmpty()){//将栈中字符放入ArrayList中
list.add(stack.pop());
}
Collections.reverse(list);//因为栈是先进后出,需要反转list
for(int i=0;i<list.size();i++){
str+=String.valueOf(list.get(i));//将字符转为字符串
}
return str;
}
}
//方法二 改进方法一:栈和StringBuilder
class Solution {
public String removeDuplicates(String S) {
Stack<Character> stack=new Stack<>();
for(char c:S.toCharArray()){
if(stack.isEmpty()){
stack.push(c);
}else{
if(stack.peek()==c){
stack.pop();
}else{
stack.push(c);
}
}
}
StringBuilder sb=new StringBuilder();
for(Character c:stack){//直接利用StringBuilder的append方法将栈中字符直接加入
sb.append(c);
}
return sb.toString();//将StringBuilder转为String
}
}
三、运行情况
方法一:
方法二:
四、刷题总结
本题的主要思路:我们利用栈,遍历的每个字符与栈顶元素相比较,若相同则弹出栈顶字符且新字符不入栈,若不相同则将新字符入栈。方法一利用Collections.reverse将ArrayList反转再将字符串拼接即可;方法二利用StringBuilder.append方法将栈中字符直接加入再将StringBuilder转为String即可。
StringBuilder的append方法: