思路一:有效的括号其实就是包括了三种类型:第一种,每个括号的左括号和右括号相邻,比如{}[]();第二种,对称型的,左边的括号和右边的括号的位置对称,比如:([{}]);第三种就是前两种类型的组合。
那么可以发现,对于第二种类型来说,只要重复把最中间的左括号和右括号删除的操作,一个有效的括号字符串最终就会为空。比如,([{}])-->删除大括号-->([])-->删除中括号-->()-->删除小括号-->s=null;由以看出,对于第一种类型也是如此,因此对于第三种类型也是如此。但如果对于非有效的括号,由于总是存在不对称的情况,因此删除过后字符串也不会为空,比如(){],删除了小括号之后留下了一个大括号的中括号,不存在成对出现的括号,字符串不为空。这样的话只需要在s非空时运用String类中的contains方法判断是否包含括号,包含的话直接用replace或者replaceAll函数删除,最后得到的字符串为空则为有效的括号,返回true,否则返回false。
代码如下:
class Solution {
public boolean isValid(String s) {
while(!s.isEmpty()){
if(s.contains("()")){
s=s.replace("()","");
}
else if(s.contains("[]")){
s=s.replace("[]","");
}
else if(s.contains("{}")){
s=s.replace("{}","");
}
else{
break;
}
}
if(s.isEmpty()){
return true;
}
else{
return false;
}
}
}
这个方法思路比较简单,但是速度也很慢。毕竟多次调用replace方法。
思路二:用栈。设定一个标识变量flag,初始化为true。遇到左括号就push,遇到右括号就pop,看pop出来的和当前右括号是否配对,如果不配对,将flag改为false。若一开始就为右括号,那就直接将flag改为false。要注意的是,一开始就需要过滤掉长度为奇数的字符串,因为长度为奇数的字符串在pop的过程中可能出现栈已经为空的情况,而且提前过滤掉可以节省时间。
代码如下:
class Solution {
public boolean isValid(String s) {
if(s.length()%2!=0)
return false;
Stack
boolean flag=true;
char ch=' ';
for(int i=0;i
if(ch=='('||ch=='['||ch=='{'){
stack.push(ch);
}
else if(ch==')'||ch==']'||ch=='}'){
if(i==0){
flag=false;
break;
}
else{
if(ch==')'&&stack.pop()!='('){
flag=false;
break;
}
else if(ch==']'&&stack.pop()!='['){
flag=false;
break;
}
else if(ch=='}'&&stack.pop()!='{'){
flag=false;
break;
}
}
}
}
if(!stack.isEmpty()){
flag=false;
}
return flag;
}
}