我想给定输入数字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时,我得到以下输出,
["()"]
我要去哪里错了?我有什么很简单的遗漏吗?
答案 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);