给定开括号在字符数组中的位置,有一个简单的算法使用计数器来查找匹配的右括号。
- 将计数器初始化为 1。
- 向前循环(向右)遍历文本。
- 如果遇到另一个左括号,则递增计数器。
- 如果遇到右括号,则递减计数器。
- 当计数器达到零时,您已找到匹配的右括号。
在代码中,这看起来像:
public int findClosingParen(char[] text, int openPos) {
int closePos = openPos;
int counter = 1;
while (counter > 0) {
char c = text[++closePos];
if (c == '(') {
counter++;
}
else if (c == ')') {
counter--;
}
}
return closePos;
}
在给定右括号的情况下,查找匹配的左括号位置的算法是相反的。
- 将计数器初始化为 1。
- 向后(向左)循环遍历文本。
- 如果遇到左括号,则递减计数器。
- 如果遇到右括号,则递增计数器。
- 当计数器达到零时,您已找到匹配的左括号。
在代码中:
public int findOpenParen(char[] text, int closePos) {
int openPos = closePos;
int counter = 1;
while (counter > 0) {
char c = text[--openPos];
if (c == '(') {
counter--;
}
else if (c == ')') {
counter++;
}
}
return openPos;
}
注意:上面的两个例子都假设括号是平衡的,所以没有进行数组边界检查。一个真正的实现会检查你没有跑出数组的末尾,如果你这样做了,就会抛出一个异常(或返回一个错误代码),表明括号在输入文本中是不平衡的。