我想创建给定输入数字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时,我得到以下输出,

["()"]


我要去哪里错了?我是否错过任何简单的事情?

最佳答案

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

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


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

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

HashSet-无复制

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);

关于java - 生成所有有效的括号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53292852/

10-12 01:44