我正在尝试尝试此问题。https://leetcode.com/problems/valid-parentheses/。但是,如果在第二个for循环中可以比较s.charAt(i)和stack.pop(),我感到困惑。
基本上,我的方法是这样的。将整个字符串推入堆栈,然后使用stack.charAt(i)遍历堆栈的前半部分,然后使用stack.pop()将其与后半部分进行比较。我只是想知道代码中可能出什么问题,因为当我期望一个真值时我得到一个假值。我只是想了解我的概念是否存在缺陷?
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
boolean done = false;
if(s.length() < 2)
return true;
for(int i = 0; i < s.length(); i++){
stack.push(s.charAt(i));
}
for(int i = 0; i < s.length()/2; i++){
if(s.charAt(i) == stack.pop())
done = true;
}
return done;
}
}
您的代码首先迭代到字符串的中间,然后填充堆栈,然后从中间到末尾并弹出堆栈。换句话说,您隐式地假设有效字符串的前半部分是各种类型的开括号,第二个是其相应的闭括号(例如([])
或{[()]}
)。但是,这些并不是唯一有效的字符串-没有限制,只要成对的匹配,就不能在右括号后面加上开括号,例如,这(()())
是一个有效字符串。
而不是对字符串中的位置进行假设,您应该遍历字符串,对于每个字符,如果是一个开括号,请将其推入堆栈,如果是一个结束括号,则将堆栈弹出并比较两个:
private static final Map<Character, Character> PARENS = new HashMap<>();
static {
PARENS.put('(', ')');
PARENS.put('[', ']');
PARENS.put('{', '}');
}
public static boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); ++i) {
char ch = s.charAt(i);
if (PARENS.containsKey(ch)) {
stack.push(ch);
} else {
if (stack.isEmpty()) {
return false;
}
char match = stack.pop();
if (ch != PARENS.get(match)) {
return false;
}
}
}
return stack.isEmpty();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句