题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
来源:力扣(LeetCode)
链接:20.有效的括号
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
由题意需要从左往右扫描左括号,然后再从右往左去寻找与前面找到的左括号一一对应的右括号,因此很容易想到借栈这一结构来辅助分析。
由于栈是先进后出,后面的元素始终在栈顶,因此,可以从左往右依次扫描字符串,若是左括号便入栈,然后判断下一括号是否是与之匹配的右括号,若是则弹出栈顶括号,否则将这下一括号进行入栈操作。
最后需要判断栈是否为空,因为若是括号是一一对应的,那么栈为空,否则栈里面还剩下未匹配的左右括号。
代码
public static boolean isValid(String s) {
//输入为空
if(s==null || s.length()==0){
return true;
}
//奇数个括号肯定不满足
if(s.length()%2!=0){
return false;
}
//利用栈来保存括号
Stack<Character> stack = new Stack<Character>();
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.size()==0){
return false;
}else {
if(stack.peek()=='('){
if(s.charAt(i)!=')'){
return false;
}else {
stack.pop();
}
}else if(stack.peek()=='['){
if(s.charAt(i)!=']'){
return false;
}else {
stack.pop();
}
}else if(stack.peek()=='{'){
if(s.charAt(i)!='}'){
return false;
}else {
stack.pop();
}
}else {
return false;
}
}
}
}
//由于要一一匹配,故最终栈为空
return stack.empty();
}
2020.03.10