产生所有有效的括号

时间:2018-11-14 03:38:22

标签: java recursion

我想给定输入数字n创建所有有效的括号字符串。例如,如果n = 3,则输出应如下所示:

["((()))","(()())","(())()","()(())","()()()"]

我针对此问题的代码如下:

private void allParenthesis(List<String> result, int n){
    if(n == 1){
        result.add("()");
        return;
    }
    allParenthesis(result, n-1);

    List<String> newResult = new ArrayList<String>();
    for(String str : result){
        newResult.add("("+str+")");
        newResult.add("()"+str);
        newResult.add(str+"()");
    }
    System.out.println(newResult+" for n:"+n);
    result = new ArrayList<String>(newResult);

}

然后在以下功能中使用此功能

public List<String> generateParenthesis(int n) {
    List<String> result = new ArrayList<String>();

    allParenthesis(result,n);
    return result;
}

但是当我输入n = 3时,我得到以下输出,

["()"]

我要去哪里错了?我有什么很简单的遗漏吗?

3 个答案:

答案 0 :(得分:3)

您将丢失已创建的结果,并且未将其传递给递归。我已经修复它并简化为一个功能。同样使用数组列表将意味着存在重复项。例如。

Str = "()";
newResult.add("()"+str); //this will result in ()()
newResult.add(str+"()"); //this will also result in the same

如果需要以上结果,请继续使用arraylist。如果不是,我建议使用LinkedHashSet作为设置,不要重复和链接一次,以便保持插入顺序。如果您不关心结果的顺序,则可以使用HashSet。

我同时提供了ArrayList和LinkedHashSet版本。

哈希集-无重复

private LinkedHashSet<String> generateParenthesis(int n){
    if(n == 1){
        LinkedHashSet<String> result = new LinkedHashSet<String>();
        result.add("()");
        return result;
    }
    LinkedHashSet<String> result = generateParenthesis(n-1);

    LinkedHashSet<String> newResult = new LinkedHashSet<String>();
    for(String str : result){
        newResult.add("("+str+")");
        newResult.add("()"+str);
        newResult.add(str+"()");
    }
    result.addAll(newResult);
    return result;
}

ArrayList -保留副本

private ArrayList<String> generateParenthesis(int n){
    if(n == 1){
        ArrayList<String> result = new ArrayList<String>();
        result.add("()");
        return result;
    }
    ArrayList<String> result = generateParenthesis(n-1);

    ArrayList<String> newResult = new ArrayList<String>();
    for(String str : result){
        newResult.add("("+str+")");
        newResult.add("()"+str);
        newResult.add(str+"()");
    }
    result.addAll(newResult);
    return result;
}

您可以像这样使用此功能。

LinkedHashSet<String> result = generateParenthesis(3);
System.out.println(result);

答案 1 :(得分:1)

您正在丢弃自己的newResult

更改

result = new ArrayList<String>(newResult);

result.clear();
result.addAll(newResult);

答案 2 :(得分:1)

这样做的时候

result = new ArrayList<String>(newResult);

您正在更新在allParenthesis定义的变量, 您从generateParenthesis传递过来的密码保持不变。

改为执行此操作

result.clear();
result.addAll(newResult);