LeetCode -- 合法的字符串

598 阅读1分钟

字符串包含三种类型:(,)和*.左括号和右括号要相互对应,并且每一个对应的左括号要在右括号之前。星号可以作为左括号、右括号或者空字符串都行。
解决方法:

  • 运用两个栈,一个存储左括号的下标,一个存储星号下标。当遇到右括号时,出栈一个左括号或者星号,当两个栈都为空时,返回false。
  • 最后在循环中依次出栈两个栈,如果左括号的栈顶值比星号大,那就返回false。
  • 最后如果左括号栈不为空,返回false
  • 其他情况返回true

代码如下:

public boolean checkValidString(String s) {
        Stack<Integer> left = new Stack<>();
        Stack<Integer> star = new Stack<>();
        for(int i=0;i<s.length();i++){
            char ch = s.charAt(i);
            if(ch == '('){
                left.push(i);
            }else if(ch == '*'){
                star.push(i);
            }else{
                if(!left.isEmpty()){
                    left.pop();
                }else if(!star.isEmpty()){
                    star.pop();
                }else{
                    return false;
                }
            }
        }
        while(!left.isEmpty() && !star.isEmpty()){
            if(left.pop() > star.pop()){
                return false;
            }
        }
        return left.isEmpty();
    }