给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 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();
}
给定一个包含括号的字符串,检查它是否有效。有效字符串需满足左括号与相同类型的右括号配对,且顺序正确。通过使用栈和哈希映射来检查括号匹配,如果字符串长度为奇数或括号不匹配,则返回false。最后,如果栈为空,说明所有括号已匹配,返回true。
841

被折叠的 条评论
为什么被折叠?



