n对括号的组合

时间:2014-01-09 22:51:33

标签: java algorithm

我有一个非常基本的问题,关于打印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是左括号,右括号,我期待输出:(()),()(),它们是两对括号的两个组合。但是这段代码如何获得第二个组合()()?感谢

3 个答案:

答案 0 :(得分:0)

运行您的代码我不确定这是否正是您正在寻找的。

但如果是 - 这是我上面提供的链接中的代码的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]);