力扣刷题:有效的括号

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

示例 1:

输入:s = "()"
输出:true

示例 2:

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

示例 3:

输入:s = "(]"
输出:false

示例 4:

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

示例 5:

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

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

Related Topics

字符串

👍 2917

👎 0

解题思路:

​ 遍历字符传

  • 情况1:如果遍历的当前字符是右括号,则入栈

  • 情况2:如果遍历的当前字符是左括号,先判断当前栈是否为空,如果当前栈为空,则说明第一个入栈的字符就是左括号,肯定是不是有效的字符串(例如")"不是有效的字符串)。然后在栈中寻找对应的右括号并将此出栈。注意:要匹配的左括号应该与当前栈顶的元素相匹配。如果不匹配,则不是有效的字符串,返回false。如果匹配,则结束当前循环,进入下一次循环(已经匹配并且出栈)

​ 最后判断栈中的长度是否为0,如果为0,则说明全部匹配成功,是有效的字符串。

import java.util.Stack;

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public boolean isValid(String s) {
        if(s.length()%2!=0) return false;
        Stack<Character> A = new Stack<Character>();
        for (int i = 0; i < s.length(); i++) {
            //右括号入栈
            if(selectStack(s.charAt(i))==1) A.push(s.charAt(i));
            //判断进入的左括号是否和栈顶的右括号匹配
            else if(A.empty()||A.pop()!=getReverse(s.charAt(i))){
                return false;//不匹配就已经表明不是有效的字符串
            }else{
                //这里说明匹配成功,被匹配到的右括号已经出栈
                continue;
            }
        }
        return A.size()==0?true:false;
    }
    public int selectStack(char a){
        //1便是右括号,0表示左括号
        return a=='{'||a=='['||a=='(' ? 1:0;
    }
    public char getReverse(char a){
        switch (a){
            case '{':
                return '}';
            case '[':
                return ']';
            case '(':
                return ')';
            case '}':
                return '{';
            case ']':
                return '[';
            case ')':
                return '(';
            default:
                return '0';
        }
    }
}
//leetcode submit region end(Prohibit modification and deletion)

在这里插入图片描述
时间复杂度O(n),空间复杂度O(n)