代码随想录算法训练营第11天 | 20. 有效的括号、 1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

代码随想录算法训练营第11天 | 20. 有效的括号、 1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

20. 有效的括号

题目:20. 有效的括号
文档讲解:代码随想录-20. 有效的括号
视频讲解:哔哩哔哩-20. 有效的括号
状态/时间:没写出来/三十分钟

思路:
考虑三种不匹配的情况。

1.左括号多了
2.右括号多了
3.左右括号不匹配例如}{
技巧:
1.遇到左括号存对应的右括号。方便比较。
2.遇到空,就return。
3.剪枝:奇数一定不符合匹配原则。可以直接return

代码:

class Solution {
    public boolean isValid(String s) {
        if (s.length() % 2 != 0) {
            return false;
        }
        Stack<Character> stack = new Stack<Character>();
        char[] c = s.toCharArray();
        for (int i = 0; i < c.length; i++) {
            if (c[i] == '{') {
                stack.push('}');
            } else if (c[i] == '[') {
                stack.push(']');
            } else if (c[i] == '(') {
                stack.push(')');
            } else if (stack.isEmpty() || stack.peek() != c[i]) {
                return false;
            } else {
                stack.pop();
            }
        }
        return stack.isEmpty();
    }
}

注意:
如果s的长度是奇数的话,那它肯定不匹配了,可以先进行判断。

1047. 删除字符串中的所有相邻重复项

题目:1047. 删除字符串中的所有相邻重复项
文档讲解:代码随想录-1047. 删除字符串中的所有相邻重复项
视频讲解:哔哩哔哩-1047. 删除字符串中的所有相邻重复项
状态/时间:写出来了/三十分钟

思路:

思路跟字符串匹配是差不多的,每个字符跟栈的原因进行匹配,

不匹配的加到栈,匹配就从栈里删除。

最后倒序从栈输出就好了。

代码:

class Solution {
    public String removeDuplicates(String s) {
        if (s == null) {
            return s;
        }
        
        char[] ch = s.toCharArray();
        // Stack<Character> stack = new Stack<Character>();
        // ArrayDeque的删除性能更好一点
        //参考:https://stackoverflow.com/questions/6163166/why-is-arraydeque-better-than-linkedlist
        ArrayDeque<Character> deque = new ArrayDeque<>();
        for (int j = 0; j < ch.length; j++) {
            if (!deque.isEmpty() && ch[j] == deque.peek()) {
                deque.pop();
            } else {
                deque.push(ch[j]);
            }
        }

        String str = "";
        //剩余的元素即为不重复的元素
        while (!deque.isEmpty()) {
            str = deque.pop() + str;
        }
        return str;
        // StringBuilder sb = new StringBuilder();
        // while (!stack.empty()) {
        //     sb.append(stack.pop());
        // }
        // sb.reverse();
        // return new String(sb);
    }
}

注意:

150. 逆波兰表达式求值

题目:150. 逆波兰表达式求值
文档讲解:代码随想录-150. 逆波兰表达式求值
视频讲解:哔哩哔哩-150. 逆波兰表达式求值
状态/时间:写出来了/三十分钟

思路:

在这里插入图片描述

其实逆波兰表达式相当于是二叉树中的后序遍历

代码:

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<Integer>();
        for (int i = 0; i < tokens.length; i++) {
            if (tokens[i].equals("+")) {
                stack.push(stack.pop() + stack.pop());
            } else if (tokens[i].equals("-")) {
                // 这里不这样写的就得要来个tmp了,因为是先push的减去后push的
                stack.push(-stack.pop() + stack.pop());
            } else if (tokens[i].equals("*")) {
                stack.push(stack.pop() * stack.pop());
            } else if (tokens[i].equals("/")) {
                int temp1 = stack.pop();
                int temp2 = stack.pop();
                stack.push(temp2 / temp1);
            }else {
                // 这里先转换成int类型,下面就不用处理了。
                stack.push(Integer.valueOf(tokens[i]));
            }

        }
        return stack.pop();
    }
}```


**注意:**

每次把结果计算完,转换成int类型存储比较好
  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值