有效的括号
- 题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
-
左括号必须用相同类型的右括号闭合。
-
左括号必须以正确的顺序闭合。
示例1:
输入:s = “()”
输出:true
示例2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([)]”
输出:false
示例 5:
输入:s = “{[]}”
输出:true
-
思路
括号匹配问题,最后出现的左括号最先被匹配(后进先出LIFO,采用栈来实现。
循环给定的字符串,遇到左括号就入栈,遇到右括号就消耗一个左括号,也就是出栈。
如果还有右括号但是左括号已经消耗完,就返回false
如果括号不匹配就返回false
如果循环完毕栈内还有剩余的左括号返回false
其他情况返回true -
代码
public static boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for (char c:s.toCharArray()){
if (c=='('||c=='['||c=='{'
stack.push(c);
}
else {
//还有右括号但是左括号已经消耗完
if (stack.empty()) return false;
//检查括号匹配
if (c==')' && stack.pop()!='(') return false;
if (c==']' && stack.pop()!='[') return false;
if (c=='}' && stack.pop()!='{') return false;
}
}
//检查栈内还有没有剩余的左括号
return stack.empty();
}