AcWing 20250106. 腾讯wxg一面(括号匹配加强版)
原题链接
简单
作者:
autumn_0
,
2025-01-06 19:31:40
,
所有人可见
,
阅读 6
题目:有三种符号()星号,其中星号可以是(,也可以是),也可以是空字符,给你由这三个字符组成的字符串,判断是否可以完成括号匹配,如:”(*)”返回true
import java.util.*;
public class Main {
public static boolean checkValidString(String s) {
// 两个栈,用来存储左括号和*的索引
Stack<Integer> leftStack = new Stack<>();
Stack<Integer> starStack = new Stack<>();
// 遍历字符串
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (ch == '(') {
// 左括号加入左栈
leftStack.push(i);
} else if (ch == ')') {
// 尝试匹配一个左括号
if (!leftStack.isEmpty()) {
leftStack.pop();
} else if (!starStack.isEmpty()) {
// 如果没有左括号,尝试匹配一个*作为左括号
starStack.pop();
} else {
return false; // 没有匹配的左括号
}
} else if (ch == '*') {
// *可以作为左括号或者右括号,记录索引
starStack.push(i);
}
}
// 处理剩余的左括号,尝试与*配对
while (!leftStack.isEmpty() && !starStack.isEmpty()) {
int leftIndex = leftStack.pop();
int starIndex = starStack.pop();
if (leftIndex > starIndex) {
return false; // 如果左括号的索引在*后面,不能匹配
}
}
// 如果左括号栈为空,说明所有的括号都能匹配
return leftStack.isEmpty();
}
public static void main(String[] args) {
// 测试用例
System.out.println(checkValidString("(*)")); // true
System.out.println(checkValidString("(*))")); // true
System.out.println(checkValidString("((*)")); // true
System.out.println(checkValidString("(((*)")); // false
}
}
秋佬强的