【发布时间】:2019-07-19 18:11:14
【问题描述】:
给定一个仅包含字符 '('、')'、'{'、'}'、'[' 和 ']' 的字符串,确定输入字符串是否有效。
输入字符串在以下情况下有效:
- 左括号必须用相同类型的括号括起来。
- 开括号必须以正确的顺序闭合。
- 请注意,空字符串也被认为是有效的。
示例 1:
Input: "()[]{}"
Output: true
Example 2:
示例 2:
Input: "{[(])}"
Output: false
我对上述问题的解决方法是:
static boolean isPair(char left,char right){
return left=='{' && right=='}' || left=='(' && right==')' || left=='[' && right==']';
}
public boolean isValid(String s) {
Stack<Character> stack= new Stack<>();
for(char ch: s.toCharArray()){
if(ch=='(' || ch=='{' || ch=='['){
stack.push(ch);
}
else{
if(!stack.isEmpty() && isPair(stack.peek(),ch))
stack.pop();
else
return false;
}
}
return stack.isEmpty();
}
我在某处找到了更智能的解决方案,但无法理解。 代码如下:
public boolean isValid(String s) {
Stack<Character> stack= new Stack<>();
for(char ch: s.toCharArray()){
if(ch=='(')
stack.push(')');
else if(ch=='{')
stack.push('}');
else if(ch=='[')
stack.push(']');
else if(stack.isEmpty() || stack.pop()!=ch)
return false;
}
return stack.isEmpty();
}
请帮助我了解最后一个 else-if 块的工作原理。
【问题讨论】:
-
您的堆栈包含未闭合的括号。第二个示例中的堆栈包含 expected 括号。最后一个
else if只是测试当前字符是预期的括号。 -
为什么你认为这个解决方案是“优化的”?它针对什么进行了优化?
-
我称它为优化只是因为内存使用量......我的代码的内存使用量是 34.4MB,而
LeetCode Platform上的这个解决方案的内存使用量是 34.2MB。 -
@jigneshkumar 如果您使用
StringBuilder(追加/删除)而不是Stack(推送/弹出),您可能会使用更少的内存,因为您将避免使用自动装箱值。 -
另外:使用索引for循环和
s.charAt(i)比toCharArray()好,因为后者复制了字符串的char数组。
标签: java optimization stack