利用栈这道题应该很轻松可以解决,下面给出常用的代码:
public static boolean isValid(String s) {
// 创建一个栈来保存左括号
Stack<Character> stack = new Stack<>();
// 遍历字符串中的每个字符
for (char c : s.toCharArray()) {
// 如果是左括号,则压入栈中
if (c == '(' || c == '{' || c == '[') {
stack.push(c);
}
// 如果是右括号,则需要进行匹配判断
else if (c == ')') {
// 栈不为空且栈顶元素为'('时,匹配成功,弹出栈顶元素
if (!stack.isEmpty() && stack.peek() == '(') {
stack.pop();
}
// 否则,匹配失败,返回false
else {
return false;
}
}
else if (c == '}') {
// 栈不为空且栈顶元素为'{'时,匹配成功,弹出栈顶元素
if (!stack.isEmpty() && stack.peek() == '{') {
stack.pop();
}
// 否则,匹配失败,返回false
else {
return false;
}
}
else if (c == ']') {
// 栈不为空且栈顶元素为'['时,匹配成功,弹出栈顶元素
if (!stack.isEmpty() && stack.peek() == '[') {
stack.pop();
}
// 否则,匹配失败,返回false
else {
return false;
}
}
// 忽略其他字符(虽然题目已明确只有括号)
}
// 如果栈为空,则说明所有括号都匹配成功
return stack.isEmpty();
}
这个代码就很通俗易懂,所有左括号压入栈内,然后遍历三个不同右括号下的情况,虽然好,但是代码过于冗余。
下面给出的这个解法就简单点:
public static boolean isValid(String s) {
// 创建一个栈来保存左括号
Stack<Character> stack = new Stack<>();
// 遍历字符串中的每个字符
for (char c : s.toCharArray()) {
// 如果是左括号,则压入栈中
if (c == '(' || c == '{' || c == '[') {
stack.push(c);
}
// 如果是右括号,则需要进行匹配判断
else if (c == ')') {
// 栈不为空且栈顶元素为'('时,匹配成功,弹出栈顶元素
if (!stack.isEmpty() && stack.peek() == '(') {
stack.pop();
}
// 否则,匹配失败,返回false
else {
return false;
}
}
else if (c == '}') {
// 栈不为空且栈顶元素为'{'时,匹配成功,弹出栈顶元素
if (!stack.isEmpty() && stack.peek() == '{') {
stack.pop();
}
// 否则,匹配失败,返回false
else {
return false;
}
}
else if (c == ']') {
// 栈不为空且栈顶元素为'['时,匹配成功,弹出栈顶元素
if (!stack.isEmpty() && stack.peek() == '[') {
stack.pop();
}
// 否则,匹配失败,返回false
else {
return false;
}
}
// 忽略其他字符(虽然题目已明确只有括号)
}
// 如果栈为空,则说明所有括号都匹配成功
return stack.isEmpty();
}
换个思路,如果是左括号就压入和它匹配的右括号,这样当是右括号的时候,看弹出的元素是不是等于目前的括号,这样代码一下就缩短了不少。