括号匹配问题

有效的括号

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

有效字符串需满足:

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

示例 1:

输入: "()"
输出: true
示例 2:

输入: "()[]{}"
输出: true
示例 3:

输入: "(]"
输出: false
示例 4:

输入: "([)]"
输出: false
示例 5:

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

       public boolean isValid(String s) {
        if (s==null || s.length()==0) return true;
        char[] ch = s.toCharArray();
        Stack stack = new Stack();
        for(int i=0;i < ch.length;i++) {
            if (ch[i]==')' && stack.size()>0 && stack.peek()=='(')
                stack.pop();
            else if (ch[i]==']' && stack.size()>0 && stack.peek()=='[')
                stack.pop();
            else if (ch[i]=='}' && stack.size()>0 &&  stack.peek()=='{')
                stack.pop();
            else {
                stack.push(ch[i]);
            }
                
        }
         if (stack.size() != 0)
                    return false;
        return true;
    }

最长有效括号

给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。

示例 1:

输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:

输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"

    public int longestValidParentheses(String s) {
    if (s==null || s.length()==0) return 0;
    char[] ch = s.toCharArray();
    Stack stack = new Stack();
    //先推入-1可以避免当栈为空时要减栈顶的index,为空时也可以正常计算
    stack.push(-1);
    int result = 0;
    for(int i=0;i < ch.length;i++) {
        //只有当')'不是第一个遍历的(stack.size()>1),并且遍历到的符号为')'而栈顶是'('时两个可以配对
        if (ch[i] == ')' && stack.size()>1 && ch[stack.peek()] == '(') {
            stack.pop();
            // (())() 前面两对result=4,后面一对result=2,凡是涉及到最长,一定是max
            result = Math.max(result, i - stack.peek());
        }else stack.push(i);
    }
    return result;
}

你可能感兴趣的:(括号匹配问题)