我的思路
很简单, 遇到 ()、[]、{} 这三对符号的左边的就入栈, 遇到右边的就直接将栈顶元素与其对应进行比较, 能组成一对符号就出栈, 否则就返回 false. 因为有 6 种情况就使用 switch 语句 :
import java.util.Stack;
class Solution {
public boolean isValid(String s) {
Stack<Character> cstack = new Stack<>();
char[] sc = s.toCharArray();
for(char c : sc) {
switch(c) {
case '(' :
cstack.push(c);
break;
case '[' :
cstack.push(c);
break;
case '{' :
cstack.push(c);
break;
case ')' :
if (!cstack.isEmpty() && cstack.peek().equals('(')) {
cstack.pop();
} else {
return false;
}
break;
case ']' :
if (!cstack.isEmpty() && cstack.peek().equals('[')) {
cstack.pop();
} else {
return false;
}
break;
case '}' :
if (!cstack.isEmpty() && cstack.peek().equals('{')) {
cstack.pop();
} else {
return false;
}
break;
default :
return false;
}
}
return cstack.isEmpty();
}
}
大神的思路
代码简洁了很多, 首先是字符串转换直接在 for 语句中进行, 然后遇到符号中左边的字符, 直接将符号对应的右边字符入栈, 这样可以直接比较. 学习了.
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
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();
}
}