第一种方法:粗暴的使用if语句判断法,考虑的情况有好几个,
①输入的字符长度为0时直接返回true
②输入的字符长度为1时、输入的字符长度为奇数时直接返回false
③输入的字符串中最后一个字符为(或者{或者[时直接返回false
最后再讨论输入的字符为一般情况时的处理方式,遍历的方式是将参与循环的字符串第一次遍历到的()或者{}或者[]从字符串中剔除,再重新遍历直到所有满足()或者{}或者[]的情况被全部剔除,最后判断全部为有效字符的添加是括号的对数等于字符串长度的二分之一。
代码如下:
public boolean isValid(String s) {
if(s.length()==0) return true;
if(s.length()==1||s.length()%2!=0||s.charAt(s.length()-1)=='{'||s.charAt(s.length()-1)=='('||s.charAt(s.length()-1)=='[') return false;
else {
int count=0;
int len=s.length()/2;
for(int i=0;i<s.length();i++) {
if(s.charAt(s.length()-1)=='{'||s.charAt(s.length()-1)=='('||s.charAt(s.length()-1)=='[') break;
if('('==s.charAt(i)) {
if(')'==s.charAt(i+1)) {
String s1=s.substring(0,i);
String s2=s.substring(i+2);
s=s1+s2;
i=-1;
count++;
continue;
}
}
if('{'==s.charAt(i)) {
if('}'==s.charAt(i+1)) {
String s1=s.substring(0,i);
String s2=s.substring(i+2);
s=s1+s2;
i=-1;
count++;
continue;
}
}
if('['==s.charAt(i)) {
if(']'==s.charAt(i+1)) {
String s1=s.substring(0,i);
String s2=s.substring(i+2);
s=s1+s2;
i=-1;
count++;
continue;
}
}
}
if(len==count) return true;
else return false;
}
}
第二种方式:栈
直接上代码
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
char[] chars = s.toCharArray();
for (char aChar : chars) {
if (stack.size() == 0) {
stack.push(aChar);
} else if (isSym(stack.peek(), aChar)) {
stack.pop();
} else {
stack.push(aChar);
}
}
return stack.size() == 0;
}
private boolean isSym(char c1, char c2) {
return (c1 == '(' && c2 == ')') || (c1 == '[' && c2 == ']') || (c1 == '{' && c2 == '}');
}