美文网首页
力扣-[简单]20. 有效的括号

力扣-[简单]20. 有效的括号

作者: _孙行者_ | 来源:发表于2021-03-25 16:04 被阅读0次

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。
 示例 1:
 输入:s = "()"
 输出:true

 示例 2:
 输入:s = "()[]{}"
 输出:true
 示例 3:

 输入:s = "(]"
 输出:false
 示例 4:

 输入:s = "([)]"
 输出:false
 示例 5:

 输入:s = "{[]}"
 输出:true

题解:

一打眼 , 这肯定是要用栈的.

自己的解法:

思路很直接

如果是左边入栈 , 如果是右边 , 出栈匹配.
最后判断下栈是不是空了.

 public boolean isValid(String s) {
        if(s == null || s.length() <= 0){
            return false;
        }
        Stack<Character> stack = new Stack<>();
        for(int i = 0,len = s.length(); i< len; i++){
            char c = s.charAt(i);
            boolean left = isLeft(c);
            if(i == 00 && ! left){
                return false;
            }
            if(left){
                stack.push(c);
            }else{
                if(stack.size() <= 0 || !isPair(stack.pop().charValue(),c)){
                    return false;
                }
            }
        }
        return stack.isEmpty();
    }
    public boolean isLeft(char ch){
        return ch == '(' || ch == '{' || ch == '[';
    }
    public boolean isPair(char c , char c2){
        return (c == '(' && c2 == ')') ||(c == '{' && c2 == '}') ||(c == '[' && c2 == ']');
    }

取巧一点

如果是左边 , 把右边的入栈 , 如果是右边 , 出栈匹配一下.

效率是高了, 但是我学得阅读性差了点 .

    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<Character>();
        for (int i=0;i<s.length();i++) {
            char c = s.charAt(i);
            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();
    }

再高效一点

遍历玩了一个数组 , 等于手动做了一个[指针]的栈.

其实我自己也想到了这个方式, 但我觉得可以性能不好 . 必然是用栈性能好.

唉... 太年轻..

 public boolean isValid(String s) {
        int len = s.length();
        if (len%2 == 1) {
            return false;
        }
        char[] stack = new char[len];
        int index = 0;
        for (char c : s.toCharArray()) {
            if (index == 0) {
                if (c == '(' || c == '[' || c == '{') {
                    stack[index++] = c;
                } else {
                    return false;
                }
            } else {
                if (c == ')' && '(' == stack[index - 1]) {
                    index--;
                } else if (c == ']' && '[' == stack[index - 1]) {
                    index--;
                } else if (c == '}' && '{' == stack[index - 1]) {
                    index--;
                } else {
                    stack[index++] = c;
                }
            } 
        }
        return index == 0;
    }

相关文章

网友评论

      本文标题:力扣-[简单]20. 有效的括号

      本文链接:https://www.haomeiwen.com/subject/gtcrhltx.html