Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java n对括号的组合_Java_Algorithm - Fatal编程技术网

Java n对括号的组合

Java n对括号的组合,java,algorithm,Java,Algorithm,我有一个非常基本的问题,关于打印n对括号的所有有效组合的算法。 我打印出了l、r和字符串s的值。但是对于下面的代码,在打印出第一个组合(())之后,l和r的值如何变成1和0,以便可以开始第二个组合() l和r是左括号,右括号,我希望得到的结果是:(()),(),这是两对括号的两种组合。但是这段代码如何获得第二个组合()?谢谢运行您的代码,我不确定这是否正是您想要的 但如果是,这里是我在上面提供的链接中代码的Java端口 public class Test0010 { public s

我有一个非常基本的问题,关于打印n对括号的所有有效组合的算法。 我打印出了l、r和字符串s的值。但是对于下面的代码,在打印出第一个组合(())之后,l和r的值如何变成1和0,以便可以开始第二个组合()


l和r是左括号,右括号,我希望得到的结果是:(()),(),这是两对括号的两种组合。但是这段代码如何获得第二个组合()?谢谢运行您的代码,我不确定这是否正是您想要的

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

}
公共类Test0010{
公共静态void main(字符串[]a){
括号(5);
}
公共静态空括号(int n){

对于(int i=1;i我相信这就是你想要的:

为了打印n对括号,我们观察到总共有n个openn个close括号

因此,您发布的代码以2 open和0 close括号开始

想象一下画一棵树,在每种状态下,我们可以进入两个不同的方向:

  • 打印另一个开括号->减少l->这样所需的闭括号数将增加,以使表达式有效->增加r

  • 如果r>0->减小r,则打印一个右括号

因此,我们可以将状态可视化如下:


从(l=2,r=0)开始,它进入(1,1),在这种状态下,它被分为两种状态:(0,2)和(1,0)。因此,代码将进一步分解,直到l=0和r=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]);
void括号(int l,int r,char[]result){

如果这个问题不是很清楚。什么是
l
,什么是
r
,什么是“n对”为什么你希望这个算法能工作?检查这些链接。希望你能把它翻译成Java。为了提出一个好的问题,你应该包括可能的输入和预期的输出。我会尝试以某种方式将配对映射到二进制数的位,并将(重复递增的)数解释为“build”每个set.l和r都是左/右括号,我希望得到的结果是:(()),(),这是两对括号的两个组合
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]);