Leetcode问题-20.有效括号

时间:2019-11-26 07:58:06

标签: java stack

我正在尝试解决这个leetcode问题: 给定仅包含字符'(',')','{','}','['和']'的字符串,请确定输入字符串是否有效。

在以下情况下,输入字符串有效:

开放式括号必须用相同类型的括号封闭。 开括号必须以正确的顺序关闭。 请注意,空字符串也被视为有效。

我认为我几乎是正确的,并且已经在该问题上进行了很长时间的研究,但是无法获得正确的输出,尤其是在输入为“())”的情况下。

类解决方案{

public boolean isValid(String s) {

    Stack<Character> c = new Stack<>();
    int n = s.length();
    boolean bool = false;

    if (s.isEmpty() | s == null) {   // Correct
        return true;
    } 

    for (int i=0 ; i<n ; i++) {
        if (s.charAt(i) == '{') {
            c.push('{');
        } else if (s.charAt(i) == '[') {
            c.push('[');
        } else if (s.charAt(i) == '(') {
            c.push('(');

        } else if (s.charAt(i) == '}' & c.peek() == '{') {
            c.pop();
        } else if (s.charAt(i) == ']' & c.peek() == '[') {
            c.pop();
        } else if (s.charAt(i) == ')' & c.peek() == '(') {
            c.pop();
        } else {
            break;
        }
    }  
    if (c.isEmpty()) {
        return true;
    } else {
        return false;
    }
}

}

3 个答案:

答案 0 :(得分:0)

问题是您没有将闭合括号添加到堆栈中,因此最后检查堆栈大小会返回错误结果。
您可以将ifs更改为在缺少开括号(即

)时已经返回false的情况。
else if (s.charAt(i) == '}') {
    if(c.peek() == '{'){
        c.pop();
    }
    else{
        return false;
    }
}

其他方面也需要进行类似的更改。

答案 1 :(得分:0)

我认为您应该在处理这些条件之前检查堆栈的大小。

else if (s.charAt(i) == '}' & c.peek() == '{') {
        c.pop();
    } else if (s.charAt(i) == ']' & c.peek() == '[') {
        c.pop();
    } else if (s.charAt(i) == ')' & c.peek() == '(') {
        c.pop();
    } 

答案 2 :(得分:0)

谢谢大家的建议。 我发现我应该在使用peek()之前检查堆栈是否为空。

else if (s.charAt(i) == '}') {
               if (!c.isEmpty() && c.peek() == '{') {
                   c.pop();
               }
               else {
                   return false;
               }