题目描述:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
解题思路:
坦白来讲这道题真的没什么思路,掉的坑也比较多,因为审题不认真,最后的一句话,“注意空字符串可被认为是有效字符串。”被吃掉了-_-|||
最后提交的代码执行效率也比较低,下次想想有没有更好的实现。
大体思路:
把字符串转换成char[],数组中第一位不是(、{、[,直接返回false。
定义一个存储对象,我用的StringBuilder。
循环数组,如果存储对象为空,将当前放入存储对象,进入下一次循环;
当前值判断是否与存储对象的最后一位相等,相等,继续将当前值放入存储对象,进入下一次循环;
不相等,判断是否为存储对象最后一位括号的闭合括号,不相等情况下判断当前值是否为(、{、[;
是:将当前值放入存储对象,开始下一次循环;
否:当前符串可以确认不是有效字符串,结束循环,返回false。
class Solution {
public boolean isValid(String s) {
boolean flag = true;
char[] aCharArray = s.toCharArray();
int aLength = aCharArray.length;
if(aLength == 0){
return flag;
}
if(aLength % 2 == 1){
flag = false;
return flag;
}
char c1,c2,c3;
StringBuilder temp = new StringBuilder();
for(int i = 0; i < aLength; i++){
if(i == 0){
if(!checkStart(aCharArray[i])){
flag = false;
break;
}
}
if("".equals(temp.toString())){
temp.append(aCharArray[i]);
continue;
}else{
c1 = temp.charAt(temp.length() - 1);
c2 = aCharArray[i];
if(c1 == c2){
temp.append(c2);
continue;
}
if(c1 != c2){
c3 = getAntonym(c2);
if(c1 == c3){
temp.deleteCharAt(temp.length() - 1);
continue;
}
if(c1 != c3 && checkStart(c2)){
temp.append(c2);
continue;
}
if(c1 != c3 && !checkStart(c2)){
flag = false;
break;
}
}
}
}
if(temp.length() > 0){
flag = false;
}
return flag;
}
public char getAntonym(char c){
char returnValue = '?';
if(')' == c){
return '(';
}
if(']' == c){
return '[';
}
if('}' == c){
return '{';
}
return returnValue;
}
public boolean checkStart(char c){
boolean flag = false;
if('(' == c || '[' == c || '{' == c) {
flag = true;
}
return flag;
}
}