//Check for balanced parenthesis without using stack: DOUBT
static char findClosing(char c)
{
if (c == '(')
return ')';
if (c == '{')
return '}';
if (c == '[')
return ']';
return Character.MIN_VALUE;
}
static boolean checkBracket(char [] arr,int n){
if(n==0)
return true ;
if(n==1)
return false;
if(arr[0]==')' || arr[0]=='}' || arr[0]==']')
return false;
char closing =findClosing(arr[0]);
int i, count = 0;
for (i = 1; i < n; i++) {
if (arr[i] == arr[0])
count++;
if (arr[i] == closing) {
if (count == 0)
break;
count--;
}
}
if (i == n)
return false;
if (i == 1)
return checkBracket(Arrays.copyOfRange(arr, i + 1, n), n - 2);
return checkBracket(Arrays.copyOfRange(arr, 1, i), i - 1) && checkBracket(Arrays.copyOfRange(arr, (i + 1), n), n - i - 1);
}
我不能理解在初始化变量count和I之后所做的逻辑。
我知道一个循环是用来遍历数组的,但是我不知道它是如何在适当的位置找到右括号的。
帮帮我。
1条答案
按热度按时间pkwftd7m1#
使用不带堆栈的递归检查平衡括号
代码不使用显式堆栈数据结构,但它绝对使用堆栈:调用堆栈。每个方法调用都涉及到堆栈上推送(或者可能不止一个,这取决于您如何描述事物),每个方法返回都涉及到相应的pop(或pops)。
如果字符(子)序列是空的,那么它是平凡平衡的。如果它只有一个元素,那么它是平凡不平衡的。如果第一个字符是所考虑的结束分隔符之一,那么它必然是不平衡的。这些是递归的基本情况。
确定哪个是与子序列的第一个字符匹配的右括号。
向前扫描字符序列以查找与序列的初始字符匹配的结束分隔符。变量
count
用于处理与当前处理的括号类型相同的嵌套括号对。此时忽略其他类型的括号。当循环终止时,i
是匹配的结束括号的索引,或者它等于序列的长度。n
,这不是数组的有效索引。在这种情况下,没有找到匹配的右括号。
否则,
如果匹配的右括号是下一个字符,则在右括号之间没有其他字符。在这种情况下,当且仅当序列的尾部是平衡的时,整个序列是平衡的。这实际上是以下的特殊情况,并且不需要它自己的情况。
否则,
当且仅当当前括号对之间的子序列是平衡的 * 并且 * 序列的尾部是平衡的,则整个序列是平衡的。