题目描述:
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
算法思想:
很容易想到使用栈这种数据结构,遇到左括号就入栈,遇到右括号就与栈顶元素进行比对。
书写过程中会遇到以下问题:
(1)如何知道匹配成功?
(2)栈空了怎么办?如{[]}),到‘)’时就会出现栈空报错
解决方案:
(1)使用一个哈希表来做匹配
(2)预先压入’?'防止栈空
代码如下:
class Solution {
public boolean isValid(String s) {
Map<Character,Character> map = new HashMap();
map.put('{','}');
map.put('[',']');
map.put('(',')');
map.put('?','?');
Stack<Character> stack = new Stack();
stack.push('?');
if(s.length() > 0 && !map.containsKey(s.charAt(0))) return false;
for(Character c:s.toCharArray()){
if(map.containsKey(c)) stack.push(c);
else if(map.get(stack.pop())!=c) return false;
}
return stack.size() == 1;
}
}
复杂度分析:
时间复杂度:O(n)
空间复杂度:O(n)
其他细节问题:
(1)为啥用Character而不用char?
Character是char的包装类,可以自动装箱和自动拆箱。
(2)s.charAt(0) 和s.toCharArray()是干啥的?
String.charAt(i)方法返回指定索引 i 处的char值。
String.toCharArray()将字符串对象的字符转化为字符数组。