[代码随想录] 第十天

20.有效的括号[https://leetcode.cn/problems/valid-parentheses/]
思路:使用栈存放字符元素,遇到左括号就进栈,遇到右括号就弹出栈顶元素判断是否匹配。注意其实判断字符串长度是否为偶数进行剪枝,并且结束时判断栈是否为空。

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

                } else {
                    return false;
                }
            } else {
                return false;
            }
        }
        return sc.isEmpty();
    }
}
-----------------------------------------------------------------------------------------------
优化思路:遍历字符串时,遇到左括号时,将与之对应的右括号进栈,遇到右括号时便只需要判断栈顶元素与当前元素是否相等。
-----------------------------------------------------------------------------------------------
class Solution {
    public boolean isValid(String s) {
        if (s.length() % 2 != 0) {
            return false;
        }
        char res;
        Stack<Character> sc = new Stack<>();
       for(int i =0;i<s.length();i++){
           if(s.charAt(i)=='{'){
               sc.push('}');
           }else if(s.charAt(i)=='['){
               sc.push(']');
               }else if(s.charAt(i)=='('){
                            sc.push(')');
                        }else if((sc.isEmpty())|| (s.charAt(i)!=sc.peek())){
                            return false;
                        }else 
                            sc.pop();
                        }
    
     return sc.isEmpty();
}
}
但是运行速度还不如我的笨方法....
**-----------------------分割线-------------------------**

1047.删除字符串中的所有相邻重复项[https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/]
思路:其实与上题思路相同,都是在遍历每个元素值,根据栈顶元素判断是栈顶元素出栈还是遍历元素进栈。但是栈中元素出栈再逆置字符串较为麻烦。

class Solution {
    public String removeDuplicates(String s) {
        Stack<Character> sc =  new Stack<>();
        for(int i=0;i<s.length();i++){
            if( !sc.isEmpty() &&sc.peek()==s.charAt(i)){
                sc.pop();
            }else{
                sc.push(s.charAt(i));
            }
        }
        String temp="";
        while(!sc.isEmpty()){
            temp+=sc.pop();
        }
         String ans="";
        int i = temp.length()-1;
        char res;
        int j=0;
        while(i >= 0){
           ans+=temp.charAt(i);
           i--;
        }
        return ans;
    }
}

在这题中,不使用栈使用StringBuilder代替栈,可能运行速度会更快。

**-----------------------分割线-------------------------**

150. 逆波兰表达式求值 [https://leetcode.cn/problems/evaluate-reverse-polish-notation/]
思路:利用栈,遍历字符数组,数字进栈,符号出栈两个数字进行相应操作,结果再入栈。最后结果就是栈底元素。

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> num = new Stack<>();
        int n1, n2;
        for (int i = 0; i < tokens.length; i++) {
            switch (tokens[i]) {
                case "+":
                    n1 = num.pop();
                    n2 = num.pop();
                    num.push(n2 + n1);
                    break;
                case "-":
                    n1 = num.pop();
                    n2 = num.pop();
                    num.push(n2 - n1);
                    break;
                case "*":
                    n1 = num.pop();
                    n2 = num.pop();
                    num.push(n2 * n1);
                    break;
                case "/":
                    n1 = num.pop();
                    n2 = num.pop();
                    num.push(n2 / n1);
                    break;
                default:
                    num.push(Integer.parseInt(tokens[i]));
            }
        }
        return num.pop();
    }
}
posted @ 2024-01-20 16:42  糟糕的家伙  阅读(11)  评论(0)    收藏  举报