我有一个非常基本的问题,关于打印n对括号的所有有效组合的算法。 我打印出l,r和string s的值。但是对于下面的代码,在打印出第一个组合(())之后,l和r的值如何变为1和0,以便它可以启动第二个组合()()?
static void brackets (int l, int r, String s) {
System.out.println(l + "" + r + " s:" + s);
if (l == 0 && r == 0) {
System.out.println(s);
}
if (l > 0) {
brackets(l-1, r+1, s + "(");
}
if (r > 0) {
brackets(l, r-1, s + ")");
}
}
public static void main(String[] args) {
brackets(2, 0, "");
}
l和r是左括号,右括号,我期待输出:(()),()(),它们是两对括号的两个组合。但是这段代码如何获得第二个组合()()?感谢
答案 0 :(得分:0)
运行您的代码我不确定这是否正是您正在寻找的。 p>
但如果是 - 这是我上面提供的链接中的代码的Java端口。
public class Test0010 {
public static void main(String[] a) {
brackets(5);
}
public static void brackets(int n) {
for (int i = 1; i <= n; i++) {
brackets("", 0, 0, i);
}
}
private static void brackets(String output, int open, int close, int pairs) {
if ((open == pairs) && (close == pairs)) {
System.out.println(output);
} else {
if (open < pairs)
brackets(output + "(", open + 1, close, pairs);
if (close < open)
brackets(output + ")", open, close + 1, pairs);
}
}
}
答案 1 :(得分:0)
我相信这就是你想要的:
要打印n对括号,我们发现总共 n打开和 n关闭括号。
所以你发布的代码以2开,0关闭括号开始。
所以想象一下,在每个州,我们可以进入两个不同的方向:
打印另一个开放式支架 - &gt;减少l - >所以需要增加所需关闭括号的数量以使表达式有效 - &gt;增加r
如果r&gt;打印一个关闭括号0 - &gt;减少r。
因此我们可以将状态可视化如下:
从(l = 2,r = 0)开始,进入(1,1),在此状态下,分为两种状态 :( 0,2)和(1,0) )。因此,代码将进一步分解,直到l = 0和r = 0来打印结果。希望你明白!
答案 2 :(得分:0)
当然,你形成所有格式良好的括号的方式非常复杂,这里有一个更直观的递归定义: -
S(N) = '('+S(N-1)+')'
or
S(N) = "()"+S(N-1)
以下是使用上述递归定义的伪代码: -
void parenthesis(int l,int r,char[] result) {
if(l<r) {
result[l] = '(';
result[r] = ')';
parenthesis(l+1,r-1,result);
result[l] = '(';
redult[l+1] = ')';
parenthesis(l+2,r,result);
}
else {
print(result);
}
}
parenthesis(0,2*N-1,new char[2*N]);