刷刷刷 Day 11 | 20. 有效的括号

20. 有效的括号

LeetCode题目要求

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

示例

输入:s = "()[]{}"
输出:true
解题思路

本题是使用栈来解决的经典题目,试想我们要想使对应的左右括号匹配,通过栈方式,可以遍历字符串的时候,将字符逐个放入
以字符串 ()[]{} 为例,遍历字符串,经历一下步骤
1、第一次遍历,取字符 ( ,此时栈为空,入栈
2、第二次遍历,取字符 ) ,此时栈不为空,取栈顶元素 ( , 进行匹配,发现 () 匹配,将栈顶元素出栈,此时栈为空
3、第三次遍历,取字符 [ ,此时栈为空,入栈
4、第四次遍历,取字符 ] ,此时栈不为空,取栈顶元素 [ , 进行匹配,发现 [] 匹配,将栈顶元素出栈,此时栈为空
5、第五次遍历,取字符 { ,此时栈为空,入栈
6、第六次遍历,取字符 } ,此时栈不为空,取栈顶元素 { , 进行匹配,发现 {} 匹配,将栈顶元素出栈,此时栈为空
经过以上 6 步骤,遍历完字符串,栈中也为空,就完成了匹配。其实,上面 34 步骤、与56步骤与 12 一样
关键的步骤就是:
如果栈为空就入栈,不为空就匹配,不匹配的就入栈;
上代码

class Solution {
    public boolean isValid(String s) {
        Deque<Character> stack = new ArrayDeque<>();
        // 先遍历字符串,如果有匹配的就出栈
        for (int i = 0; i < s.length(); i++) {
            // 如果栈为空,就入栈一个, 不为空的就匹配, 不匹配的就入栈
            if (stack.isEmpty()) {
                stack.push(s.charAt(i));
            } else {
                char stackChar = stack.peek();
                if (stackChar == '(' && s.charAt(i) == ')'
                || stackChar == '[' && s.charAt(i) == ']'
                || stackChar == '{' && s.charAt(i) == '}') {
                    stack.pop();
                } else {
                    stack.push(s.charAt(i));   
                }
            }
        }

        return stack.isEmpty();
    }
}

附:学习资料链接

posted @ 2023-01-13 16:48  blacksonny  阅读(0)  评论(0编辑  收藏  举报