题目介绍
力扣20题:https://leetcode-cn.com/problems/valid-parentheses/
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
分析
判断括号的有效性,这是一个非常经典的问题。
由于给定字符串中只包含 ‘(’,’)’,’{’,’}’,’[’,’]’ ,所以我们不需要额外考虑非法字符的问题。
对于合法的输入字符,关键在于遇到一个“左括号”时,我们会希望在后续的遍历中,遇到一个相同类型的“右括号”将其闭合。
由于规则是:后遇到的左括号,要先闭合,因此我们想到,利用一个栈可以实现这个功能,将左括号放入栈顶,遇到右括号时弹出就可以了。
具体实现
代码实现非常简单:我们可以创建一个栈,然后遍历字符串。遇到左括号,就压栈;遇到右括号,就判断和当前栈顶的左括号是否匹配,匹配就弹栈,不匹配直接返回false。
代码演示如下:
// 使用栈
public boolean isValid(String s){
Deque<Character> stack = new LinkedList<>();
// 遍历字符串中所有字符,依次判断
for (int i = 0; i < s.length(); i++){
// 获取当前字符
char ch = s.charAt(i);
// 判断当前字符是左括号还是右括号
// 如果是左括号,直接将对应的右括号入栈
if ( ch == '(' ){
stack.push(')');
} else if ( ch == '[' ){
stack.push(']');
} else if ( ch == '{' ){
stack.push('}');
} else {
// 如果是右括号,弹栈判断是否匹配
if (stack.isEmpty() || stack.pop() != ch) return false;
}
}
return stack.isEmpty();
}
复杂度分析
- 时间复杂度:O(n),其中n是字符串s的长度。只需要遍历一次字符串。
- 空间复杂度:O(n)。栈中最多会保存字符串中所有的左括号,数量为O(n)。