领扣(LeetCode)有效的括号 个人题解
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
示例 2:
输入: "()[]{}" 输出: true
示例 3:
输入: "(]" 输出: false
示例 4:
输入: "([)]" 输出: false
示例 5:
输入: "{[]}" 输出: true
这道题的思路比较简单,使用栈存放左括号,一旦遇到右括号就弹出栈顶元素进行判断是否配对,如果不是直接返回false。遍历字符串完毕后看栈内是否还有元素,如果有则为false,如果没有为true
做个长度是否为偶数的特判可以提高速度,也要注意如果遇到输入的字符串都是右括号的特殊情况,栈内没东西可以弹出的特判。
代码如下:
1 class Solution { 2 public boolean isValid(String s) { 3 Stack<Character> stack = new Stack<>(); 4 if (s.length() % 2 != 0) 5 return false; 6 for (int i = 0; i < s.length(); i++) { 7 if (s.charAt(i) == '(' || s.charAt(i) == '[' || s.charAt(i) == '{') { 8 stack.push(s.charAt(i)); 9 } else { 10 if (stack.isEmpty()) 11 return false; 12 char tmp = stack.pop(); 13 if (tmp == '(' && s.charAt(i) == ')') 14 continue; 15 else if (tmp == '[' && s.charAt(i) == ']') 16 continue; 17 else if (tmp == '{' && s.charAt(i) == '}') 18 continue; 19 else 20 return false; 21 } 22 23 } 24 if (stack.isEmpty()) 25 return true; 26 else 27 return false; 28 } 29 }