20. 有效的括号
题目:
给定一个只包括 '(',')','{','}','[',']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例:
输入: "{[]}"
输出: true
栈
涉及到括号匹配,使用栈一定是标准答案~
几个注意的点:
- 推荐使用LinkedList构成的双向队列(Deque)取代Stack。
- 推荐将
String
转换为char[]
再做操作,具体原因可以看 10. 正则表达式匹配 - 代码实现上,为了方便我使用的是在ASCII表上前后括号的差值不超过2这一点来匹配括号的,各位大佬有着各种各样的方法(哈希表之类的)大家可以选择性的参考。
import java.util.Deque;
import java.util.LinkedList;
class Solution {
public boolean isValid(String s) {
char[] str = s.toCharArray();
Deque<Character> stack = new LinkedList<>();
for (char c : str) {
if(c == '(' || c == '[' || c == '{') stack.push(c);
else if(stack.isEmpty() || Math.abs(stack.pop() - c) > 2) return false;
}
return stack.isEmpty();
}
}
复杂度分析
-
时间复杂度: O ( n ) O(n) O(n)
时间复杂度为字符串长度n。
-
空间复杂度: O ( n ) O(n) O(n)
栈的额外开销为 O ( n ) O(n) O(n)。