题解 | #有效括号序列#
有效括号序列
https://www.nowcoder.com/practice/37548e94a270412c8b9fb85643c8ccc2
思路
这是一个经典的括号匹配问题,我们只要创建一个栈在遍历字符串的时候将左括号加入栈中,遇到与之匹配的右括号可以弹出与之匹配。
需要注意以下情况:
- 如果遇到的右括号与栈顶的括号不匹配,则说明该序列无效
- 如果遍历完序列,栈空了,但字符串还存在未匹配的右括号,则说明该序列无效
- 如果字符串遍历完了,但栈中还有左括号,则说明该序列无效
代码
import java.util.*;
public class Solution {
/**
* 左小括号
*/
String leftParenthesis = "(";
/**
* 左中括号
*/
String leftBracket = "[";
/**
* 左大括号
*/
String leftCurlyBrace = "{";
/**
* @param s string字符串
* @return bool布尔型
*/
public boolean isValid(String s) {
// 创建一个辅助栈存储左括号
Stack<String> stack = new Stack<>();
// 将字符串分割为字符串数组
String[] string = s.split("");
// 遍历字符串数组
for (String symbol : string) {
// 判断当前字符串是否为左括号
if (leftParenthesis.equals(symbol) || leftBracket.equals(symbol) ||
leftCurlyBrace.equals(symbol)) {
// 将左括号加入栈中
stack.push(symbol);
// 跳过后续操作
continue;
}
// 判断栈是否为空
if (!stack.isEmpty()) {
// 判断当前字符串是否与辅助栈顶元素匹配
if (matching(stack.peek()).equals(symbol)) {
// 匹配则弹出
stack.pop();
} else {
// 不匹配则,该序列无效
return false;
}
} else {
// 为空说明栈空但还存有右括号,该序列无效
return false;
}
}
// 遍历完字符串后判断栈内是否还存有左括号
return stack.isEmpty();
}
/**
* 匹配对应的括号
*
* @param s 左括号
* @return java.lang.String
* @apiNote 传入左括号,返回对应的右括号
* @since 2023/1/7 20:46
*/
public String matching(String s) {
if (leftParenthesis.equals(s)) {
return ")";
} else if (leftBracket.equals(s)) {
return "]";
}
return "}";
}
}