题目如下:
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.
这道题也是想了很久,今天走路的时候突然想到可以用压栈弹栈的方式来实现,就马上去LeetCode把它撸完了,下面是已Accepted的代码:
public boolean isValid(String s) {
Stack<String> stack = new Stack<String>();
for(int i=0;i<s.length();i++){
char candidate = s.charAt(i);
if(candidate=='{'||candidate=='['||candidate=='('){
stack.push(candidate+"");
}else{
if(stack.isEmpty()){
return false;
}
if((candidate=='}' && stack.peek().equals("{"))||
(candidate==']' && stack.peek().equals("["))||
(candidate==')' && stack.peek().equals("("))){
stack.pop();
}else{
return false;
}
}
}
if(stack.isEmpty()){
return true;
}else{
return false;
}
}
题目的解题思路如下:
(1)如果发现是输入'{','[','('是这三种之中的一种,就直接把它们压入栈中;
(2)如果输入为'}',']',')'就需要获取栈顶的元素,如果能和这三种匹配上就直接把它探出,即如果输入为‘}’就查看栈顶元素,如果是'{'就将'{'弹出,否则返回false;
(3)如果循环结束后,栈中还存在元素,就说明有未匹配的项,应当返回false,反之则返回true。
然后是评论区的回答,下面这个方法也是使用了“栈”,但是快一些,思路是一样的,代码如下:
public boolean isValid(String s) {
char[] stack = new char[s.length()];
int head = 0;
for(char c : s.toCharArray()) {
switch(c) {
case '{':
case '[':
case '(':
stack[head++] = c;
break;
case '}':
if(head == 0 || stack[--head] != '{') return false;
break;
case ')':
if(head == 0 || stack[--head] != '(') return false;
break;
case ']':
if(head == 0 || stack[--head] != '[') return false;
break;
}
}
return head == 0;
}
依然来自评论区,思路一样,但是更精辟些,代码如下:
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();
}
大致就是这样。