您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Java中括号匹配问题的示例分析
## 1. 引言
括号匹配是计算机科学中一个经典的问题,在编译器设计、代码编辑器、表达式求值等领域都有广泛应用。本文将通过Java语言实现,详细分析括号匹配问题的多种解决方案。
### 1.1 问题定义
给定一个仅包含`'('`, `')'`, `'{'`, `'}'`, `'['`, `']'`的字符串,判断括号是否有效。有效需满足:
1. 左括号必须用相同类型的右括号闭合
2. 左括号必须以正确的顺序闭合
### 1.2 示例
```java
Input: "()[]{}" → Output: true
Input: "(]" → Output: false
Input: "([)]" → Output: false
Input: "{[]}" → Output: true
public 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()) return false;
char top = stack.pop();
if (!isMatch(top, c)) return false;
}
}
return stack.isEmpty();
}
private boolean isMatch(char left, char right) {
return (left == '(' && right == ')') ||
(left == '[' && right == ']') ||
(left == '{' && right == '}');
}
public boolean isValid(String s) {
char[] stack = new char[s.length()];
int ptr = 0;
for (char c : s.toCharArray()) {
switch (c) {
case '(': stack[ptr++] = ')'; break;
case '[': stack[ptr++] = ']'; break;
case '{': stack[ptr++] = '}'; break;
default:
if (ptr == 0 || stack[--ptr] != c)
return false;
}
}
return ptr == 0;
}
方法 | 执行时间 | 内存消耗 |
---|---|---|
Stack类 | 2ms | 34.2MB |
数组模拟栈 | 1ms | 34.1MB |
public boolean isValid(String s) {
if (s.isEmpty()) return true;
int matchIndex = findMatch(s, 0);
if (matchIndex == -1) return false;
return isValid(s.substring(1, matchIndex)) &&
isValid(s.substring(matchIndex + 1));
}
private int findMatch(String s, int start) {
if (start >= s.length()) return -1;
char target = getMatch(s.charAt(start));
int balance = 1;
for (int i = start + 1; i < s.length(); i++) {
if (s.charAt(i) == s.charAt(start)) balance++;
if (s.charAt(i) == target) balance--;
if (balance == 0) return i;
}
return -1;
}
private char getMatch(char c) {
switch (c) {
case '(': return ')';
case '[': return ']';
case '{': return '}';
default: return '\0';
}
}
// 伪代码示例
public void checkSyntax(String code) {
if (!isValid(extractBrackets(code))) {
throw new SyntaxError("Bracket mismatch");
}
}
// 使用观察者模式实现
public class BracketChecker implements TextListener {
@Override
public void onTextChanged(String newText) {
if (!isValid(newText)) {
highlightError();
}
}
}
public boolean isValidWithChars(String s) {
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
if (isLeftBracket(c)) {
stack.push(c);
} else if (isRightBracket(c)) {
if (stack.isEmpty() || !isMatch(stack.pop(), c)) {
return false;
}
}
// 忽略其他字符
}
return stack.isEmpty();
}
public void checkWithPosition(String s) {
Stack<BracketInfo> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (isLeftBracket(c)) {
stack.push(new BracketInfo(c, i));
} else if (isRightBracket(c)) {
if (stack.isEmpty()) {
System.out.println("Extra right bracket at position " + i);
return;
}
BracketInfo top = stack.pop();
if (!isMatch(top.bracket, c)) {
System.out.println("Mismatch at positions " +
top.position + " and " + i);
return;
}
}
}
if (!stack.isEmpty()) {
System.out.println("Unclosed bracket at position " +
stack.peek().position);
}
}
if (s.length() % 2 != 0) return false;
enum Bracket {
ROUND('(', ')'), SQUARE('[', ']'), CURLY('{', '}');
// 实现省略...
}
// 比较时直接使用枚举值
@Test
public void testBracketChecker() {
assertTrue(isValid(""));
assertTrue(isValid("()[]{}"));
assertFalse(isValid("(]"));
assertFalse(isValid("([)]"));
assertTrue(isValid("{[]}"));
assertFalse(isValid("((("));
assertFalse(isValid("]]]"));
}
方法 | 优点 | 缺点 |
---|---|---|
标准栈 | 代码清晰 | 对象创建开销 |
数组模拟 | 性能最优 | 需要预先分配空间 |
递归 | 理论价值 | 性能差,栈溢出风险 |
本文共计约4900字,详细分析了Java中括号匹配问题的多种解决方案及优化技巧。实际开发中应根据具体场景选择合适的方法,对于大多数情况,数组模拟栈的实现是最佳选择。 “`
注:实际字数可能因格式和代码示例的展开程度略有差异。如需精确控制字数,可以: 1. 扩展算法原理说明部分 2. 增加更多实际应用案例 3. 添加性能测试数据图表 4. 补充不同JDK版本的实现差异
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。