给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution { public boolean isValid(String s) { // 如果s的长度是奇数,直接返回FALSE即可。 // 这里是用位运算来判断奇偶。当(s.length()&1) != 1时,是偶数。 if (!((s.length()&1) != 1)) { return false; } Stack<Character> stack = new Stack<>(); for (char a : s.toCharArray()) { if (a == '(' || a == '[' || a == '{') { stack.push(a); } else { // 如果栈为空,则直接返回FALSE。否则出栈会报错。 if (stack.empty()) { return false; } else { char b = stack.pop(); // 这部分判断可以用一个map来代替。 if (a == ')') { if (b != '(') { return false; } } else if (a == ']') { if (b != '[') { return false; } } else if (a == '}') { if (b != '{') { return false; } } } } } // 如果运行结束后栈为空,返回true,否则意味着左括号数量比右括号数量多,不匹配。 return stack.empty(); } }
用map优化后的代码:
由于数据量较小,所以用的速度反倒没有直接判断快。
class Solution { public boolean isValid(String s) { // 如果s的长度是奇数,直接返回FALSE即可。 // 这里是用位运算来判断奇偶。当(s.length()&1) != 1时,是偶数。 if (!((s.length()&1) != 1)) { return false; } // 内部类添加数据。 Map<Character, Character> map = new HashMap<>() {{ put('(', ')'); put('[', ']'); put('{', '}'); }}; Stack<Character> stack = new Stack<>(); for (char a : s.toCharArray()) { if (map.containsKey(a)) { stack.push(a); } else { // 如果栈为空,则直接返回FALSE。否则出栈会报错。 if (stack.empty()) { return false; } else if (map.get(stack.pop()) != a) { return false; } } } // 如果运行结束后栈为空,返回true,否则意味着左括号数量比右括号数量多,不匹配。 return stack.empty(); } }标签:---,20,map,else,力扣,括号,return,false,stack From: https://www.cnblogs.com/allWu/p/17136906.html