1. 使用栈
算法思想:
- 遍历字符串,如果遇到左括号,则将其压入栈中
- 如果遇到右括号,则弹出栈顶元素,判断是否与该右括号匹配
- 如果匹配,则继续遍历;如果不匹配,则该字符串无效
- 最后,如果栈为空,则字符串有效;否则,字符串无效
Java代码实现:
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 (stack.isEmpty() ||
(c == ')' && stack.pop() != '(') ||
(c == '}' && stack.pop() != '{') ||
(c == ']' && stack.pop() != '[')) {
return false;
}
}
return stack.isEmpty();
}
2. 使用正则表达式
算法思想:
- 使用正则表达式,将所有合法的括号子串替换为空字符串
- 如果最后剩余的字符串为空,则该字符串有效;否则,字符串无效
Java代码实现:
public static boolean isValid(String s) {
String regex = "\\(\\)|\\{\\}|\\[\\]";
while (s.contains("()") || s.contains("{}") || s.contains("[]")) {
s = s.replaceAll(regex, "");
}
return s.isEmpty();
}
3. 使用计数器
算法思想:
- 遍历字符串,如果遇到左括号,则将相应的计数器加1
- 如果遇到右括号,则将相应的计数器减1
- 如果任意一个计数器小于0,则该字符串无效
- 最后,如果所有计数器均为0,则字符串有效;否则,字符串无效
Java代码实现:
public static boolean isValid(String s) {
int leftCount = 0;
int middleCount = 0;
int rightCount = 0;
for (char c : s.toCharArray()) {
if (c == '(') {
leftCount++;
} else if (c == '{') {
middleCount++;
} else if (c == '[') {
rightCount++;
} else if (c == ')') {
leftCount--;
} else if (c == '}') {
middleCount--;
} else if (c == ']') {
rightCount--;
}
if (leftCount < 0 || middleCount < 0 || rightCount < 0) {
return false;
}
}
return leftCount == 0 && middleCount == 0 && rightCount == 0;
}