我正在尝试解决这个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;
}
}
}
答案 0 :(得分:0)
问题是您没有将闭合括号添加到堆栈中,因此最后检查堆栈大小会返回错误结果。
您可以将ifs更改为在缺少开括号(即
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;
}