题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
方法一:栈
将左括号放入栈顶,右括号用于匹配,取出栈顶元素。使用哈希表存储每一种括号。哈希表的键为右括号,值为相同类型的左括号。
在遍历结束后,如果栈中没有左括号,说明我们将字符串 s中的所有左括号闭合,返回True,否则返回False。
int n =s.length();
if(n%2==1){
return false;
}
Map<Character,Character> pairs =new HashMap<Character,Character>(){{
put(')','(');
put(']','[');
put('}','{');
}};
Deque<Character> stack=new LinkedList<Character>();
for(int i=0;i<n;i++){
char ch=s.charAt(i);
if(pairs.containsKey(ch)){
if(stack.isEmpty()||stack.peek()!=pairs.get(ch)){
return false;
}
stack.pop();
}else{
stack.push(ch);
}
}
return stack.isEmpty();
复杂度分析
时间复杂度:O(n),其中 n 是字符串 s 的长度。
空间复杂度: O(n+∣Σ∣),其中Σ 表示字符集,本题中字符串只包含 6 种括号,∣Σ∣=6。