给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
// class Solution {
// public boolean isValid(String s) {
// HashMap<Character, Integer> map = new HashMap<>();
// map.put('(',1);
// map.put(')',-1);
// map.put('{',5);
// map.put('}',-5);
// map.put('[',10);
// map.put(']',-10);
// char[] chars = s.toCharArray();
// ArrayList<Character> characters = new ArrayList<>();
// for (int i = 0; i < chars.length ; i++) {
// if(map.get(chars[i]) < 0 && characters.size() == 0 ){
// return false;
// }
// if(map.get(chars[i] )> 0){
// characters.add(chars[i]);
// }
// if (map.get(chars[i]) < 0 && map.get(characters.remove(characters.size() - 1 )) + map.get(chars[i]) != 0) {
// return false;
// }
// }
// return characters.isEmpty();
// }
// }
// class Solution {
// public boolean isValid(String s) {
// int length = s.length() / 2;
// for (int i = 0; i < length; i++) {
// s = s.replace("()", "").replace("{}", "").replace("[]", "");
// }
// return s.length() == 0;
// }
// }
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
//遇到左括号,将相应的右括号入栈
if (c == '(') stack.push(')');
else if (c == '[') stack.push(']');
else if (c == '{') stack.push('}');
//遇到右括号且匹配
else if (!stack.isEmpty() && stack.peek() == c) stack.pop();
//出现右括号多余或者右括号不匹配
else return false;
}
//如果字符串遍历结束,栈中仍有字符,说明有左括号多余
//否则反之
return stack.isEmpty();
}
}
边界条件的判断是很容易出错的部分,稍微几次BUG容易脑袋不清醒,最好是一鼓作气,磨刀不误砍柴工。