题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
- 注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
来源:力扣(LeetCode)
链接:力扣
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
这是一道经典的使用栈来解决问题的例题。一共有三种括号,都是左右一对,给定一组括号,判断括号是否匹配,如果匹配返回true,否则返回false。
要想匹配的话,首先这些括号的个数肯定是偶数个;
- 我们创建一个栈,用来存放每个左括号相匹配的右括号,之后如果当前括号是 ‘[’ ,那就向stack中push一个与之相匹配的 ‘]’ ,同样其余的左括号也是一样;
- 那如果遇到右括号怎么办?如果在字符数组中,当前字符是 ‘]’ ,那就取出栈顶的括号和当前括号相比,如果不相等,返回false,如果相等,栈顶括号就出栈;
- 其实还有一种情况,当栈中所有的右括号都出栈后,栈的大小是0,此时如果当前是右括号,无法比较,直接返回false。
最后如果栈是空的,表示全部匹配,返回true,否则返回false。
- 第一种情况:(,(,{,[,],},)
- 第二种情况:(,{,],)
- 第三种情况: (,{,[,],},),)
代码实现
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();
char [] chs = s.toCharArray();
for(char c : chs){
// 遇到左括号就向栈中添加匹配的右括号
if(c == '('){
stack.push(')');
}else if(c == '['){
stack.push(']');
}else if(c == '{'){
stack.push('}');
}else if(stack.isEmpty()||stack.pop()!=c){
// 对应第三种和第二种情况,不相等和栈提前为空返回false
return false;
}
}
return stack.isEmpty();
}
}
这一篇动图讲的比博主更清楚,LeetCode有效的括号