Valid Parentheses (java 思路)

思路:1.检查String大小,若为1和0肯定不匹配;2.利用栈的原理进行对比,‘{’'(' '['三个符号放入栈,右侧符号来进行对比。

注意:我的第一个程序在“run code”里面是能成功运行的不过在提交后结果错误,查了下是因为我使用了全局变量,而leetcode本身不支持。

class Solution {
    private boolean flag = true;
    public boolean isValid(String s) {
        //首先判断字符串尺寸,如果为空或者1则不可能匹配
        if(s.length() < 2) flag = false;
        else{
            Stack<Character> x = new Stack<Character>();
            for(int i = 0; i < s.length(); i++){
                //判断,如果为左侧符号,压入栈中(先进后出)
                //检查字符用“==”,检查String用“isEqual()”
                if(s.charAt(i) == '{' || s.charAt(i) == '[' || s.charAt(i) == '(')
                    x.push(s.charAt(i));
                else{
                    //判断如果不是则侧符号,此时栈中无符号,肯定为false
                    if(x.size() == 0){
                        flag = false;
                    }
                    //pop函数可以调用并移除栈顶层的字符
                    char top = x.pop();
                    //判断符号和栈中顶层符号是否匹配
                    if(s.charAt(i) == '}')
                        if(top != '{'){
                            flag = false;
                            break;
                        }
                    else if(s.charAt(i) == ']')
                        if(top != '['){
                            flag = false;
                            break;
                        }
                    else if(s.charAt(i) == ')')
                        if(top != '('){
                            flag = false;
                            break;
                        }
                }
            }
            //还需要检查栈中有无剩余字符,若有剩余,代表不匹配
            if(x.size() != 0)
                flag = false;
        }
        return flag;
    }
}

其实下面这段代码应该是对的,可是用到了多个return,就总是会被误判为错的。

class Solution {
    public boolean isValid(String s) {
        Stack<Character> x = new Stack<Character>();
        for(int i = 0; i < s.length(); i++){
            //判断,如果为左侧符号,压入栈中(先进后出)
            //检查字符用“==”,检查String用“isEqual()”
            if(s.charAt(i) == '{' || s.charAt(i) == '[' || s.charAt(i) == '(')
                x.push(s.charAt(i));
            else{
                //判断如果不是zuo侧符号,此时栈中无符号,肯定为false
                if(x.size() == 0){
                    return false;
                }
                //pop函数可以调用并移除栈顶层的字符
                char top = x.pop();
                //判断符号和栈中顶层符号是否匹配
                if(s.charAt(i) == '}')
                    if(top != '{')
                        return false;
                else if(s.charAt(i) == ']')
                    if(top != '[')
                        return false;
                else if(s.charAt(i) == ')')
                    if(top != '(')
                        return false;
            }
        }
        //还需要检查栈中有无剩余字符,若有剩余,代表不匹配
        return x.size() == 0;
   
    }
}

所以打算缩减为一个return,而又不能设置全局变量存储bool值。

下面其实是参考人家别人的一段代码,通过向栈内压入反向字符,减少了代码和return数,就成功了

class Solution {
    public boolean isValid(String s) {
        Stack<Character> x = new Stack<Character>();
        for(int i = 0; i < s.length(); i++){
            //判断,如果为左侧符号,压入栈中(先进后出)
            //检查字符用“==”,检查String用“isEqual()”
            if(s.charAt(i) == '{')
                x.push('}');
            else if(s.charAt(i) == '[')
                x.push(']');
            else if(s.charAt(i) == '(')
                x.push(')');
            else if(x.size() == 0 || x.pop() != s.charAt(i))
                return false;
        }
        return x.size() ==0;
   
    }
}


猜你喜欢

转载自blog.csdn.net/yang_csdnforobts/article/details/79769746