
开始思路:
for循环每个字符
左括号 入栈 右括号匹配
要注意的是 当个数为奇数的时候
我的处理是:
class Solution {
public boolean isValid(String s) {
//() ()[]{}——————如果匹配 那么相邻的两个左括号和右括号 一定匹配
//([)] 最右边的左括号[ 和其最近的右括号 一定匹配 否则不正确
//要考虑到奇数个数的情况
Stack<Character> t=new Stack<>();
boolean res=true;
for(int i=0;i<s.length();i++){
switch(s.charAt(i)){
case ')':
if(!t.empty()&&'(' == t.pop()) {
break;
}else{
return false;
}
case ']':
if(!t.empty()&&'[' == t.pop()) {
break;
}else{
return false;
}
case '}':
if(!t.empty()&&'{' == t.pop()) {
break;
}else{
return false;
}
default:
t.push(s.charAt(i));
if(i==s.length()-1&&(i+1)%2!=0){//要考虑到奇数个数的情况 连续多个左括号
res=false;
}
break;
}
}
return res;
}
}
但如果处理奇数 奇数肯定不匹配 可以在开头就加上一个判断语句
前面通过率不高:

看了一下评论区 瞥到了hashmap
那就试试:
我试不出来、、、、、、
唉
class Solution {
public boolean isValid(String s) {
int n = s.length();
if (n % 2 == 1) {
return false;
}
//官方解答 :果然巧妙
//][ 括号逆序如hashmap 如下
Map<Character, Character> pairs = new HashMap<Character, Character>() {{
put(')', '(');
put(']', '[');
put('}', '{');
}};
//然后依次判断 如果是[{( 左括号 那么依次入栈
//如果是右括号 )]} 判断 栈是不是为空————栈空 此右括号无法匹配
//判断栈的最上面一个s.peek()是否等于此右括号 在哈希表中的V值 如果不等————不匹配
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();
}
}
知识点:
java中 Stack定义:
Stack<> s=new Stack<>();
stack是栈 除了 pop push等函数之外 还提供了一个peek() 即查看最顶部一个元素
这篇博客探讨了如何检查字符串中括号的有效性,特别是处理奇数个数的情况。作者首先尝试使用栈来匹配左括号和右括号,然后注意到可以利用HashMap来优化解决方案。官方解答利用HashMap存储括号配对,遍历字符串时检查括号匹配,并通过栈来跟踪左括号。最终,当所有括号都匹配时,栈应为空。博客重点讨论了括号匹配的算法实现和奇数个数的特殊情况处理。
1322

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



