原题描述
LeetCode第20题 有效的括号
难度:简单
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合
我的思路
创建一个栈,并依次遍历整个字符串:当遇到左括号时,就将其压入栈;当遇到右括号时,就将栈顶元素弹出,检查是否能与右括号匹配。如果不能匹配,,可以提前中止循环,返回fasle。
当遍历完数组发现全部匹配时,可以返回true。
我的尝试
第一次
class Solution {
public boolean isValid(String s) {
if (s.length()==0){
return true;
}
char[] chars = s.toCharArray();
Stack<Character> stack = new Stack<>();
for (char symbol : chars) {
switch (symbol){
case ')':
if (stack.pop()!='('){
return false;
}
break;
case ']':
if (stack.pop()!='['){
return false;
}
break;
case '}':
if (stack.pop()!='{'){
return false;
}
break;
default:
stack.push(symbol);
break;
}
}
return true;
}
}
提交结果:解答错误
输入:"["
输出:true
预期:fasle
分析原因:当左括号的数量多于右括号时,必然有左括号不会被匹配到。但是该代码只是在右括号匹配左括号失败时才会返回false,没有对左括号匹配右括号进行检查。
解决思路:如果左括号的数量多于右括号,那么一定会有额外的左括号留在栈中。但是对于能正确匹配的字符串来说,左右括号的数量是相等的,栈中不应该会有残留。因此,右括号匹配完后,只有栈为空才能代表完全匹配。
第二次
class Solution {
public boolean isValid(String s) {
if (s.length()==0){
return true;
}
char[] chars = s.toCharArray();
Stack<Character> stack = new Stack<>();
for (char symbol : chars) {
switch (symbol){
case ')':
if (stack.pop()!='('){
return false;
}
break;
case ']':
if (stack.pop()!='['){
return false;
}
break;
case '}':
if (stack.pop()!='{'){
return false;
}
break;
default:
stack.push(symbol);
break;
}
}
return stack.isEmpty();
}
}
提交结果:执行出错
出错信息:java.util.EmptyStackException
输入:"]"
分析原因:程序遇到’]'时直接要求栈弹出顶元素去匹配左括号,但是此时栈为空,抛出异常。
解决思路:如果右括号在匹配栈顶元素时遇到栈为空,那就意味着没有能够与之匹配的左括号,可以直接返回false。
第三次
class Solution {
public boolean isValid(String s) {
if (s.length()==0){
return true;
}
char[] chars = s.toCharArray();
Stack<Character> stack = new Stack<>();
for (char symbol : chars) {
switch (symbol){
case ')':
if (stack.isEmpty() || stack.pop()!='('){
return false;
}
break;
case ']':
if (stack.isEmpty() || stack.pop()!='['){
return false;
}
break;
case '}':
if (stack.isEmpty() || stack.pop()!='{'){
return false;
}
break;
default:
stack.push(symbol);
break;
}
}
return stack.isEmpty();
}
}
提交结果:通过