Given a string containing just the characters ‘(‘, ‘)’, ‘{‘, ‘}’, ‘[’ and ‘]’, determine if the input string is valid.
The brackets must close in the correct order, “()” and “()[]{}” are all valid but “(]” and “([)]” are not.法
乍一看这道题还是蛮熟悉的,确实本题也不难,但也是走了一些弯路。我之前做过一道类似的题,不过其中只有一种括号,解题思路:需要设一个整型变量,遍历一遍字符串,只要最后的结果不为零,便不有效(当然还有些特殊)。
于是,根据大脑信号,我的初始思路如下:设置了3个整型变量,每个变量对应一种括号,若为左括号,相对应的变量加一,若为右括号,相应的变量减一。根据最后的结果以及特殊情况进行最后的判断。(当然没有AC)代码:
int len = s.length();
char[] array = s.toCharArray();
int littleb = 0;
int midb = 0;
int bigb = 0;
for(int i=0;i<len;i++){
if(littleb < 0 || midb < 0 || bigb < 0){
return false;
}
switch(array[i]){
case '(':
littleb++;
break;
case ')':
littleb--;
break;
case '[':
midb++;
break;
case ']':
midb--;
break;
case '{':
bigb++;
break;
case '}':
bigb--;
break;
}
}
if(littleb ==0 && midb == 0 && bigb == 0){
return true;
}
return false;
写完后,感觉还挺简单的,潇洒的提交一下,73个案例通过了70个,我想是不是什么特殊情况没考虑到,失败的案例为“([)]”,我一看,不妙,我的思路不对。以我的思路,这种情况根本就没办法判断。失望之余不知从哪看到栈的身影,ok,思路来了:只要栈顶元素是左括号并且和当前元素是一对,那么就让出栈,不成对或者不是左括号则进栈。具体代码如下:
此处AC
public boolean isValid(String s) {
char[] array = s.toCharArray();
//使用HashMap来匹配相对应的括号
HashMap<Character,Character> map = new HashMap();
map.put('(',')');
map.put('[',']');
map.put('{','}');
Stack<Character> stack = new Stack();
int i = 0;
while(i < array.length){
if(!stack.empty()){
char top = stack.peek();
if(isLeft(top) && array[i] == map.get(top)){
stack.pop();
}else//不是右括号或者不匹配(开始我把这一步忘了)
stack.push(array[i]);
}else//栈空则入栈
stack.push(array[i]);
i++;
}
if(stack.empty())
return true;
return false;
}
public boolean isLeft(char c){
if('('== c || '{' == c || '[' == c)
return true;
return false;
}
后来在讨论区看到一个答案感觉很漂亮,他的思想:遍历字符数组,如果是左括号,就把相对应的右括号入栈,当遍历完左括号并开始遍历右括号了,把栈顶元素出栈,如果和数组当前元素相同,继续,否则结束。其代码如下:
public boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();
for (char c : s.toCharArray()) {
if (c == '(')
stack.push(')');
else if (c == '{')
stack.push('}');
else if (c == '[')
stack.push(']');
else if (stack.isEmpty() || stack.pop() != c)
return false;
}
return stack.isEmpty();
}
这样,没有使用HashMap,也仅仅遍历一遍数组,空间消耗比我的少。