算法修炼Day11|20. 有效的括号 ● 1047. 删除字符串中的所有相邻重复项 ● 150. 逆波兰表达式求值

49 阅读1分钟

LeetCode:20. 有效的括号 - 力扣(LeetCode)

1.思路

用栈实现先入后出,只要括号是匹配对称的,则stack.isEmpty()返回true,否则返回false。 思路:遇到左括号将对应的右括号入栈,遇到右括号将栈中元素输出与之匹配判断,不等则为false。 极值情况:左括号多、右括号多、左右不匹配,左括号多和左右不匹配的判断是一致的,判断栈中字符和字符串对应的字符是否匹配:c != stack.pop(),右括号多时,栈是空的,需要对栈做判空处理:stack.isEmpty()

2.代码实现
class Solution {
    public boolean isValid(String s) {
        // if (s.length() % 2 != 0) return false;
        Stack<Character> stack = new Stack<>();
        for (char c : s.toCharArray()) {
            if (c == '[') {
                stack.push(']');
            } else if (c == '(') {
                stack.push(')');
            } else if (c == '{') {
                stack.push('}');
            } else if (stack.isEmpty() || c != stack.pop()) {
                return false;
            } 
        }
        return stack.isEmpty();
    }
}
3.复杂度分析

时间复杂度:O(n).

空间复杂度:O(n).

LeetCode:1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

1.思路

借助栈的对称性,栈顶元素和当前字符串匹配时即可直接弹出,否则加入栈,之后遍历栈,将其赋值给字符串,可变字符换串反转转换成String类型输出即可.

2.代码实现
class Solution {
    public String removeDuplicates(String s) {
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            if (stack.isEmpty() || s.charAt(i) != stack.peek()){
                stack.push(s.charAt(i));
            } else {
                stack.pop();
            }

        }
        StringBuilder sb = new StringBuilder();
        while (!stack.isEmpty()) {
            sb.append(stack.pop());
        }
        return sb.reverse().toString();
    }
}
3.复杂度分析

时间复杂度:O(n + m).

空间复杂度:O(m).

LeetCode:150. 逆波兰表达式求值 - 力扣(LeetCode)

1.思路

将"+、-、*、/" 四种情况直接操作,其他的入栈String[]元素转为int的值: Integer.parseInt(tokens[i])

2.代码实现
class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        for (int i = 0; i < tokens.length; i++) {
            if (tokens[i].equals("+")) { // "+" 必须带双引号
                int a = stack.pop();
                int b = stack.pop();
                int c = a + b;
                stack.push(c);
            } else if (tokens[i].equals("-")) { // 只能equals()方法比较
                int a = stack.pop();
                int b = stack.pop();
                int c = b - a; // 注意前者 - 后者,前者在前后弹出
                stack.push(c);
            } else if (tokens[i].equals("*")) {
                int a = stack.pop();
                int b = stack.pop();
                int c = a * b;
                stack.push(c);
            } else if (tokens[i].equals("/")) {
                int a = stack.pop();
                int b = stack.pop();
                int c = b / a; // 同减号操作
                stack.push(c);
            } else {
                stack.push(Integer.parseInt(tokens[i])); // 将string[]数组元素转化为int类型的数值方法...
            }
        }
        return stack.pop();
    }
}
3.复杂度分析

时间复杂度:O(n).

空间复杂度:O(1).