20. 有效的括号

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

有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。

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

有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。

思路

使用栈,利用stack的后进先出的特性,遍历括号字符串。
若字符串以(、[、{开头,且从左至右遍历过程中,遇到(、[、{则向stack栈中压入对应的右括号,遇到)、]、}则弹出栈顶元素并与当前字符比较,相同则继续,不同则结束返回false。
若字符串以)、]、}三者之一开头,则为无效字符串,以栈空为条件结束返回false

解题方法

1、声明一个空栈 2、使用toCharArray()将字符串转为字符数组,并在for循环中遍历
3、循环内:若该字符对应(、[、{则向栈中压入对应的右括号;反之则弹出栈顶元素并判断是否与当前字符相同且栈是否为空栈。若为空栈或与栈顶元素不同,则返回false
4、循环结束后,判断栈是否为空,为空则有效;反之无效。

复杂度

时间复杂度: 时间复杂度:O(n),其中 n 是字符串 s 的长度。

空间复杂度: 空间复杂度:O(n+∣Σ∣),其中 Σ 表示字符集,本题中字符串只包含 6 种括号,∣Σ∣=6。栈中的字符数量为
O(n),而哈希表使用的空间为 O(∣Σ∣),相加即可得到总空间复杂度。

code

import java.util.Stack;

public class ValidParentheses {
    public static boolean isValid(String s) {
        //如果 长度为奇数直接返回false
        if(s.length() % 2 == 1){
            return false;
        }
        // 新建一个栈来存放括号
        Stack<Character> stack = new Stack<Character>();
        for(char ch :s.toCharArray())
        {
            if(ch == '(')
                stack.push(')');
            else if (ch == '[')
                stack.push(']');
            else if(ch == '{')
                stack.push('}');
            else if(stack.isEmpty()||ch != stack.pop())
                return false;
        }
        return stack.isEmpty();
    }

    public static void main(String[] args) {
        System.out.println(isValid("()"));
    }
}

你可能感兴趣的:(Java算法,java)