有效的括号
题目
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合, 左括号必须以正确的顺序闭合。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
辅助栈
算法思路
括号都是成对出现,且右括号必须在左括号的右边出现,所以这里判断是否是有效括号,首选需要判断字符串长度是否能被2整除,其次再判断右括号是否总是在左括号之后出现且与之匹配。
在遍历字符串里面元素的时候,我们希望遇到一个右括号的时候就消掉一个左括号,这样成对消除之后再校验是否还有未被消除的括号,有则说明不是有效的括号,反之是。既然想要遇到一个右括号就立马取出最近的左括号进行成对消除,那么就可以利用栈先进后出的特性,这样就可以总能取到最近的一个左括号。
编码
class Solution {
public boolean isValid(String s) {
if(s.isEmpty() || s.length() % 2 != 0){
return false;
}
Map<Character, Character> map = new HashMap<>();
map.put(')', '(');
map.put(']', '[');
map.put('}', '{');
Stack<Character> stack = new Stack<>();
for(int i=0; i<s.length(); i++){
char c = s.charAt(i);
if(map.containsKey(c)){
if(stack.isEmpty() || map.get(c) != stack.pop()){
return false;
}
}else{
stack.push(c);
}
}
return stack.isEmpty();
}
}
复杂度分析
当前的时间复杂度主要取决于字符串的长度n,所以时间复杂度为O(n);空间复杂度为O(n)。