20. 有效的括号

1,599 阅读1分钟

有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。

我的思路是从字符串中间劈开,左右两端去做对应加减,刚好是0,就是一对。

我的解答

class Solution {
    public boolean isValid(String s) {
            if(s.length()%2 == 1){return false;}
            String[] arr = s.split("");
            for (int i = 0; i < arr.length; i++) {
                if(arr[i].equals("(")){
                    arr[i] = "1";
                } else if (arr[i].equals(")")) {
                    arr[i] = "-1";
                } else if (arr[i] .equals("{")) {
                    arr[i] = "2";
                } else if (arr[i] .equals("}")) {
                    arr[i] = "-2";
                } else if (arr[i].equals("[")) {
                    arr[i] = "3";
                } else if (arr[i].equals("]")) {
                    arr[i] = "-3";
                }
            }
            for (int i = 0; i < arr.length/2; i++) {

                if (!(Integer.valueOf(arr[i]) + Integer.valueOf(arr[arr.length - i - 1]) == 0 )) {
                    return false;
                }
            }

            return true;       }

}

但是我没有考虑到一对对出现的 例如 {}()[] 这种所以 就是不对的。
这个问题是一个比较有意思 我看了评论里面的大佬解答的:

      if len(s)%2 != 0:
            return False
        while '()' in s or '[]' in s or '{}' in s:
            s = s.replace('[]','').replace('()','').replace('{}','')
        return True if s == '' else False

我看完人傻了,这个思路是和公共最长前缀的思路是一样的,减法计算,这种思路我觉得是一种考虑方式,但是需要变更字符串,因为String类型的字符串是final 修饰的,每次字符串变更都是开辟一次新的空间去存储这个String对象,相当于增加了内存的使用。这个问题官方解决是通过栈来解决的。栈,额哈哈,大学没有好好学数据结构,现在gg思密达了,回去补补过几天再说。
2022-5-11 补充

class Solution {
  public  boolean isValid(String s) {
        Stack<Character> arrayStack = new Stack<>();
        char[] chars = s.toCharArray();
         for (char c : chars) {
            switch (c) {
                case '{':
                case '[':
                case '(':
                    arrayStack.push(c);
                    break;
                case '}':
                case ']':
                case ')':
                    if (!arrayStack.isEmpty()){
                        char ch = arrayStack.pop().toString().toCharArray()[0];
                        if ((c == '}' && ch != '{' )||( c == ']' &&
                        ch != '[' )||( c == ')' && ch != '(')){
                            System.out.println("Error: " + ch + " 不匹配 " + c);
                            return false;
                        }
                    } else {
                        return false;
                    }
                    break;
                default:
                    break;
            }
        }
        if (arrayStack.isEmpty()){
            return true;
        }
        return false;
    }
}

使用的是栈的数据结构,这里很好的使用了先入后出的逻辑,完美的诠释了括号匹配的情况。