-20.有效的括号.利用栈的特性解题

首先看一下题目:

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

所用语言:Java

class Solution {
    public boolean isValid(String s) {
        Stack<Character> charStack = new Stack<>();
               
        boolean isTrue = true;
        for(int i=0; i<s.length(); i++){
            if(s.charAt(i) == '[' || s.charAt(i) == '{' || s.charAt(i) == '('){
                charStack.push(s.charAt(i));
            }else{
                
                if(charStack.empty()){
                    return false;
                }
                
                char c = charStack.pop();
                if((c == '[' && s.charAt(i) == ']') || (c == '(' && s.charAt(i) == ')') || (c == '{' && s.charAt(i) == '}')){
                    continue;
                }else{
                    
                    isTrue = false;
                    break;
                }
            }
        }
        if(!charStack.empty()){
           return false;
        }
        
        return isTrue;
    }
}

思路:
题目要求左括号必须用相同类型的右括号闭合,且左括号必须以正确的顺序闭合。括号类型共有这些:"{","}","[","]","(",")"。我们可以用一个容器去存放遍历字符串时遇到的左括号,当遍历遇到右括号时就将最后放入容器中的那个左括号取出来进行匹配。如果匹配则继续,如果不匹配则直接返回false。
这就是代码中循环里的基本逻辑。
这个容器可以是数组,链表,但是最方便的还是栈,因为栈是后进先出,所以我们就可以很方便的取出最后放入的那个左括号。

上面描述的基本逻辑是解决不了题目,因为还有一种情况就是如果某个测试用例只有左括号或者右括号时,就得另外做判断,
当只有左括号时,经过循环之后,栈不会为空,因为没有右括号对其进行匹配,所以在最后返回结果之前必须要判断栈是否为空,如果为空就表示所有的左括号已经匹配完了,或者是没有字符串中没有左括号,只有右括号,这就是下一种情况。不为空就表示左括号未匹配完,所以返回False。
当只有右括号时:在循环中会进入我们else部分的逻辑分支。这个时候也必须要判断栈是否为空,如果为空,则就意味着没有左括号去与当前这个右括号进行匹配。所以返回False。

发布了15 篇原创文章 · 获赞 14 · 访问量 7027

猜你喜欢

转载自blog.csdn.net/i_wonder_how_/article/details/90729229
今日推荐