给定一个只包括'('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
- 1 <=
s.length
<= 104 s
仅由括号'()[]{}'
组成
思路
因为Java中也是自带stack
这种数据结构的(import java.util.*
),所以这题也就好做了。
对于左括号,直接入栈;
对于右括号,判断它和栈顶元素是不是恰好构成一对括号,如果构成了一对括号,那么直接取出栈顶元素,如果不是,直接返回false
(当前括号已经不匹配了,可以直接不看后面的情况返回)。
另外,在观察栈顶元素的时候,一定要记得先判断栈此时是不是非空的,如果是空栈,又碰到了右括号的情况,也可以直接返回,因为没有相应的左括号与它匹配。
最后,如果读完了整个输入字符串,发现栈还是空的,那么就可以返回true
了,因为所有括号都已经完成了匹配(也可以偷懒直接返回stack.isEmpty()
)。
代码
public class Solution {
Stack<Character> stack = new Stack<Character>();
public boolean isValid(String s) {
for(int i=0;i<s.length();i++) {
if(s.charAt(i)=='('||s.charAt(i)=='{'||s.charAt(i)=='[') {
stack.push(s.charAt(i));
}
else {//遇到右括号
if(stack.isEmpty()==false) {//若栈非空,判断括号是否匹配
if((stack.peek()=='('&&s.charAt(i)==')')||(stack.peek()=='{'&&s.charAt(i)=='}')||(stack.peek()=='['&&s.charAt(i)==']')) {
stack.pop();
}
else{
return false;
}
}
else return false;//若栈已空,但碰到了右括号,直接返回
}
}
return stack.isEmpty();
}
}