
⚙️个人专栏:
《Java算法时空: 图解手撕原理》 《 多线程 》 《JavaSE基础原理 》 《数据结构》
✨与其内耗自己,不如责备他人



目录
[一. 力扣 1047. 删除字符串中的所有相邻重复项](#一. 力扣 1047. 删除字符串中的所有相邻重复项)
[1. 题目](#1. 题目)
[2. 算法原理](#2. 算法原理)
[3. 代码](#3. 代码)
[二. 力扣 844. 比较含退格的字符串](#二. 力扣 844. 比较含退格的字符串)
[1. 题目](#1. 题目)
[2. 算法原理](#2. 算法原理)
[3. 代码](#3. 代码)
[三. 力扣 227. 基本计算器 II](#三. 力扣 227. 基本计算器 II)
[1. 题目](#1. 题目)
[2. 算法原理](#2. 算法原理)
[3. 代码](#3. 代码)
[四. 力扣 394. 字符串解码](#四. 力扣 394. 字符串解码)
[1. 题目](#1. 题目)
[2. 算法原理](#2. 算法原理)
[3. 代码](#3. 代码)
[五. 力扣 946. 验证栈序列](#五. 力扣 946. 验证栈序列)
[1. 题目](#1. 题目)
[2. 算法原理](#2. 算法原理)
[3. 代码](#3. 代码)
一. 力扣 1047. 删除字符串中的所有相邻重复项
1. 题目
题目的意思不难理解,删除相同元素,有点像开心消消乐
2. 算法原理
3. 代码
            
            
              java
              
              
            
          
              public String removeDuplicates(String s) {
        StringBuilder stringBuilder = new StringBuilder();
        int cur = -1;
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (cur != -1) {
                char c = stringBuilder.charAt(cur);
                if (ch == c) {
                    stringBuilder.deleteCharAt(cur);
                    cur--;
                }else {
                    stringBuilder.append(ch);
                    cur++;
                }
            }else {
                stringBuilder.append(ch);
                cur++;
            }
        }
        return stringBuilder.toString();
    }
        二. 力扣 844. 比较含退格的字符串
1. 题目
2. 算法原理
与上面那道题原理一致,这里不过多赘述,需要注意,如果对空文本输入退格字符,文本继续为空,意味着可能#比有效字符多
3. 代码
            
            
              java
              
              
            
          
              public boolean backspaceCompare(String s, String t) {
        StringBuilder tmp1 = new StringBuilder();
        StringBuilder tmp2 = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (tmp1.length() != 0 && ch == '#') {
                tmp1.deleteCharAt(tmp1.length() - 1);
            }else {
                if (ch != '#') {
                    tmp1.append(ch);
                }
            }
        }
        for (int i = 0; i < t.length(); i++) {
            char ch = t.charAt(i);
            if (tmp2.length() != 0 && ch == '#') {
                tmp2.deleteCharAt(tmp2.length() - 1);
            }else {
                if (ch != '#') {
                    tmp2.append(ch);
                }
            }
        }
        return tmp1.toString().equals(tmp2.toString());
    }
        三. 力扣 227. 基本计算器 II
1. 题目
遇到计算求值类型的题目, 别犹豫, 直接上栈
2. 算法原理
3. 代码
            
            
              java
              
              
            
          
              public int calculate(String s) {
        Stack<Integer> stack = new Stack<Integer>();
        char op = '+';
        int i = 0;
        int n = s.length();
        while (i < n) {
            char ch = s.charAt(i);
            if (ch == ' ') {
                i++;
            }else if (ch >= '0' && ch <= '9') {
                int tmp = 0;
                while (i < n && ch >= '0' && ch <= '9') {
                    tmp = tmp * 10 + (ch - '0');
                    i++;
                    if (i < n) {
                        ch = s.charAt(i);
                    }
                }
                if (op == '+') {
                    stack.push(tmp);
                }else if (op == '-') {
                    stack.push(-tmp);
                }else if (op == '*') {
                    stack.push(stack.pop() * tmp);
                }else {
                    stack.push(stack.pop() / tmp);
                }
            }else {
                op = ch;
                i++;
            }
        }
        int sum = 0;
        while (!stack.isEmpty()) {
            sum += stack.pop();
        }
        return sum;
    }
        四. 力扣 394. 字符串解码
1. 题目
类似于加括号的计算器运算, 这里也是先计算括号里面的, 但不同的是括号中的是字母,我们要根据括号外面的数字字符,来进行对应次数的复制
2. 算法原理
3. 代码
            
            
              java
              
              
            
          
              public String decodeString(String s) {
        Stack<String> zs = new Stack<>();
        Stack<Integer> zi = new Stack<>();
        zs.push("");
        int i = 0;
        int n = s.length();
        char[] c = s.toCharArray();
        while (i < n) {
            if (c[i] >= '0' && c[i] <= '9' ) {
                int num = 0;
                while (i < n && c[i] >= '0' && c[i] <= '9') {
                    num = num * 10 + (c[i] - '0');
                    i++;
                }
                zi.push(num);
            }else if (c[i] == '[') {
                i++;
                StringBuilder stringBuilder = new StringBuilder();
                while (i < n && c[i] >= 'a' && c[i] <= 'z') {
                    stringBuilder.append(c[i]);
                    i++;
                }
                zs.push(stringBuilder.toString());
            }else if (c[i] == ']') {
                int j = zi.pop();
                String tmp = zs.pop();
                StringBuilder ret = new StringBuilder();
                while (j > 0) {
                    ret.append(tmp);
                    j--;
                }
                i++;
                String concat = zs.pop().concat(ret.toString());
                zs.push(concat);
            }else {
                StringBuilder stringBuilder = new StringBuilder();
                while (i < n && c[i] >= 'a' && c[i] <= 'z') {
                    stringBuilder.append(c[i]);
                    i++;
                }
                String concat =  zs.pop().concat(stringBuilder.toString());
                zs.push(concat);
            }
        }
        return zs.pop();
    }
        五. 力扣 946. 验证栈序列
1. 题目
这道题是学习栈这个数据结构的经典题, 判断栈的出栈序列是否正确, 既然是判断栈的出栈,那么与栈这个数据结构也是脱离不了干系的
2. 算法原理
3. 代码
            
            
              java
              
              
            
          
              public boolean validateStackSequences(int[] pushed, int[] popped) {
        Stack<Integer> stack = new Stack<>();
        int j = 0;
        for (int i = 0; i < pushed.length; i++) {
            stack.push(pushed[i]);
            while (!stack.isEmpty() && stack.peek() == popped[j]) {
                stack.pop();
                j++;
            }
        }
        return stack.isEmpty();
    }
        








