LeetCode刷题进阶之删除字符串中的所有相邻重复项(1047)

一、题目
LeetCode刷题进阶之删除字符串中的所有相邻重复项(1047)
演示示例:
LeetCode刷题进阶之删除字符串中的所有相邻重复项(1047)
二、测试代码

//方法一 栈和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
    }
}

三、运行情况

方法一:
LeetCode刷题进阶之删除字符串中的所有相邻重复项(1047)
方法二:
LeetCode刷题进阶之删除字符串中的所有相邻重复项(1047)
四、刷题总结

本题的主要思路:我们利用栈,遍历的每个字符与栈顶元素相比较,若相同则弹出栈顶字符且新字符不入栈,若不相同则将新字符入栈。方法一利用Collections.reverse将ArrayList反转再将字符串拼接即可;方法二利用StringBuilder.append方法将栈中字符直接加入再将StringBuilder转为String即可。
StringBuilder的append方法:
LeetCode刷题进阶之删除字符串中的所有相邻重复项(1047)

上一篇:1047:判断能否被3,5,7整除


下一篇:k8s的list-watch机制和 pod调度约束