本题有两个思路:
思路一:“替换思想”,只要是有效的括号对,那()或[]或{}必定会成对出现,那我们就可以用“”(啥也没有的字符串)代替有效的括号对,检查是否被替换就可以括号对是否有效。注意:这里的括号可能出现嵌套,所以需要循环去重复替换。
代码如下:
public boolean isValid (String s) { boolean flag=true; //flag用来标记前面一次的括号序列是否被替换过,若没有被替换,说明已经结束了 while(flag){ String str =s; s=s.replace("()","").replace("[]","").replace("{}",""); if(str.equals(s)){//本次替换后和上次一样,说明本次没替换。 flag=false;//替换工作结束,标记改为false } } if("".equals(s)){//最后判断括号是否全部被替换 return true; } return false; }
思路二:利用栈的后进先出特点。遍历括号序列,遇到左括号就入栈,遇到右括号就从栈顶拿出一个左括号进行匹配,若括号类型相同,则继续遍历下一个括号;若不相同,就直接返回false.
代码如下:
public boolean isValid (String s) { if(s.length()==1) return false; Stack<Character> stack = new Stack(); for(int i=0;i<s.length();i++){ if(s.charAt(i)=='(' || s.charAt(i)=='[' ||s.charAt(i)=='{'){ stack.push(s.charAt(i)); }else{ if(stack.size()==0) return false;//看栈是否为空。 if(match(stack.pop(),s.charAt(i))) continue;//匹配成功就继续遍历 else return false;//不成功就返回false } } if(stack.size()>0) return false;//最后查看栈是否还有括号 return true; } //辅助函数,用于判断两个括号字符似乎否匹配 public boolean match(char c,char s){ switch(c){ case '(': if(s==')')return true; break; case '[': if(s==']')return true; break; case '{': if(s=='}')return true; break; } return false; }