给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
提示:
1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成
通过次数1,413,745提交次数3,194,846
思路:
首先判断是单数个字符还是偶数个字符,
随后创建字符hashmap表
创建栈
循环遍历,将左边的字符入栈,右边的字符进行出栈比较,同时还要判断栈空的条件
如果匹配完成,判断stack是否为空,空说明刚好匹配完,出栈完全。
class Solution {
public boolean isValid(String s) {
int n = s.length();
if(n % 2 == 1){
return false;
}
Map<Character,Character> map = new HashMap();
map.put(')','(');
map.put(']','[');
map.put('}','{');
Stack<Character> stack = new Stack();
for(int i = 0; i < n ;i++){
char c = s.charAt(i);
if(map.containsKey(c)){
if(stack.isEmpty() || stack.peek() != map.get(c) ){
return false;
}
stack.pop();
}else{
stack.push(c);
}
}
return stack.isEmpty();
}
}
//以下两块代码等效。一个是刚开始直接pop比较,后者是取出栈顶,然后在pop,
//相比较来说可能后者性能更为好一些吧,因为后者直接比较栈顶,如果false直接出栈顶,然后不用在pop了。
if(map.containsKey(c)){
if(stack.isEmpty() || stack.pop() != map.get(c) ){
return false;
}
}
if(map.containsKey(c)){
if(stack.isEmpty() || stack.peek() != map.get(c) ){
return false;
}
stack.pop();
}