LeetCode( Valid Parentheses)有效的括号

Given a string containing just the characters ‘(‘, ‘)’, ‘{‘, ‘}’, ‘[’ and ‘]’, determine if the input string is valid.
The brackets must close in the correct order, “()” and “()[]{}” are all valid but “(]” and “([)]” are not.法
乍一看这道题还是蛮熟悉的,确实本题也不难,但也是走了一些弯路。我之前做过一道类似的题,不过其中只有一种括号,解题思路:需要设一个整型变量,遍历一遍字符串,只要最后的结果不为零,便不有效(当然还有些特殊)。
于是,根据大脑信号,我的初始思路如下:设置了3个整型变量,每个变量对应一种括号,若为左括号,相对应的变量加一,若为右括号,相应的变量减一。根据最后的结果以及特殊情况进行最后的判断。(当然没有AC)代码:

int len = s.length();
        char[] array = s.toCharArray();
        int littleb = 0;
        int midb = 0;
        int bigb = 0;
        for(int i=0;i<len;i++){
            if(littleb < 0 || midb < 0 || bigb < 0){
                return false;
            }
            switch(array[i]){
                case '(':
                    littleb++;
                    break;
                case ')':
                    littleb--;
                    break;
                case '[':
                    midb++;
                    break;
                case ']':
                    midb--;
                    break;
                case '{':
                    bigb++;
                    break;
                case '}':
                    bigb--;
                    break;
            }
        }
        if(littleb ==0 && midb == 0 && bigb == 0){
            return true;
        }
        return false;

写完后,感觉还挺简单的,潇洒的提交一下,73个案例通过了70个,我想是不是什么特殊情况没考虑到,失败的案例为“([)]”,我一看,不妙,我的思路不对。以我的思路,这种情况根本就没办法判断。失望之余不知从哪看到栈的身影,ok,思路来了:只要栈顶元素是左括号并且和当前元素是一对,那么就让出栈,不成对或者不是左括号则进栈。具体代码如下:
此处AC

public boolean isValid(String s) {
        char[] array = s.toCharArray();
        //使用HashMap来匹配相对应的括号
        HashMap<Character,Character> map = new HashMap();
        map.put('(',')');
        map.put('[',']');
        map.put('{','}');
        Stack<Character> stack = new Stack();
        int i = 0;
        while(i < array.length){
            if(!stack.empty()){
                char top = stack.peek();
                if(isLeft(top) && array[i] == map.get(top)){
                    stack.pop();
                }else//不是右括号或者不匹配(开始我把这一步忘了)
                    stack.push(array[i]);
            }else//栈空则入栈
                stack.push(array[i]);
            i++;
        }
        if(stack.empty())
            return true;
        return false;
    }


    public boolean isLeft(char c){
        if('('== c || '{' == c || '[' == c)
            return true;
        return false;
    }

后来在讨论区看到一个答案感觉很漂亮,他的思想:遍历字符数组,如果是左括号,就把相对应的右括号入栈,当遍历完左括号并开始遍历右括号了,把栈顶元素出栈,如果和数组当前元素相同,继续,否则结束。其代码如下:
public boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();
for (char c : s.toCharArray()) {
if (c == '(')
stack.push(')');
else if (c == '{')
stack.push('}');
else if (c == '[')
stack.push(']');
else if (stack.isEmpty() || stack.pop() != c)
return false;
}
return stack.isEmpty();
}

这样,没有使用HashMap,也仅仅遍历一遍数组,空间消耗比我的少。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值