思路:
1,这里利用了一个与运算排除所有奇数长度字符串 2,利用栈来回显前一个元素,每次栈不为空,我们再次入栈时候判断下括号是否成对即可,另外因为我们是拿后面元素和前面元素匹配,因此要注意peek拿的是左括号,当前字符应该是右括号
代码:
代码语言:javascript复制 class Solution {
public boolean isValid(String s) {
//如果长度是奇数
if ((s.length() & 1) == 1) {
return false;
}
//向栈内加数据相同的取数据
Stack<Character> stack = new Stack<Character>();
for (char c : s.toCharArray()) {
if (stack.isEmpty()) {
stack.push(c);
} else {
if (equalCheck(c, stack.peek())) {
stack.pop();
} else {
stack.push(c);
}
}
}
return stack.isEmpty();
}
private boolean equalCheck(char c, Character peek) {
return c == ')' && peek == '('
|| c == ']' && peek == '['
|| c == '}' && peek == '{';
}
}
也有人用hash先存了值,进行匹配,咱们也写下这种写法
代码语言:javascript复制class Solution {
public boolean isValid(String s) {
Map<Character,Character> map=new HashMap<Character,Character>(8) {
{
put(')','(');
put(']','[');
put('}','{');
}
};
//如果长度是奇数
if ((s.length() & 1) == 1) {
return false;
}
//向栈内加数据相同的取数据
Stack<Character> stack = new Stack<Character>();
for (char c : s.toCharArray()) {
if (stack.isEmpty()) {
stack.push(c);
} else {
if (stack.peek().equals(map.get(c))) {
stack.pop();
} else {
stack.push(c);
}
}
}
return stack.isEmpty();
}
}
不过貌似结果并不如何,快的是第一种