很久之前做的答案
public boolean isValid(String s) {
char[] c = new char[10000];
int j=0;
for(int i=0;i<s.length();i++){
switch(c[j]){
case '(':
if(s.charAt(i)==')') j--;
else c[++j] = s.charAt(i);
break;
case '[':
if(s.charAt(i)==']') j--;
else c[++j] = s.charAt(i);
break;
case '{':
if(s.charAt(i)=='}') j--;
else c[++j] = s.charAt(i);
break;
default:
c[++j] = s.charAt(i);
}
}
return j==0;
}
- 通过循环模仿栈的push以及pop操作一一对消
最近学的答案
First
public boolean isValid(String s) {
while(s.contains("{}")||s.contains("[]")||s.contains("()")){
s = s.replace("{}","");
s = s.replace("[]","");
s = s.replace("()","");
}
return s.isEmpty();
}
- 一直判断是否存在闭括号,有一个删除一个,如果没有多余的括号,自然,到最后字符串长度为0
代码较为简洁,但效率较上一个方案低,我也是有点迷惑,然后我猜是使用replace函数的时候占用了较多的时空资源
Second
public boolean isValid(String s) {
Stack<Character> stack = new Stack();
for(int i=0;i<s.length();i++){
char c = s.charAt(i);
if(c=='('||c=='['||c=='{'){
stack.push(c);
}else{
if(stack.isEmpty()) return false;
char left = stack.pop();
if(left=='('&&c!=')') return false;
if(left=='{'&&c!='}') return false;
if(left=='['&&c!=']') return false;
}
}
return stack.isEmpty();
}
- 这个思路跟我很久之前那个思路其实是一样的,但是利用到了java包装好的Stack结构
效率较最早的那个依旧差了一点,大概是因为java自带的类需要考虑更多的问题,而我模拟出来的只是针对单一问题