题目是N对括号,让你生成可能的所有组合。我用的是递归实现,每递归一次填入一个"("或")"。用i和j记录二者的数目,比如i=j时,就不能添加")",同时i>=N也不能添加"(",当递归到最后一位是添加")"然后把数组连成字符串打入list中即可。
之前使用的是tmp复制s再递归,导致内存溢出,递归是应注意。
private void gene(String[] s, int i,int j,int n, LinkedList<String> l){
if((i+j)==(n-1)){
//String[] tmp =s;
s[i+j]=")";
String ss="";
while(n>0){
ss = s[--n]+ss;
}
l.add(ss);
}else{
int sheng = n/2;
if(i<sheng){
String[] tmp =s;
s[i+j]="(";
gene(tmp,i+1,j,n,l);
if(i>j){
//String[] tmp2 =s;
s[i+j]=")";
gene(s,i,j+1,n,l);
}
}else{
//String[] tmp =s;
s[i+j]=")";
gene(s,i,j+1,n,l);
}
}
}
public List<String> generateParenthesis(int n) {
LinkedList l = new LinkedList();
if(n==0)return l;
String[] s = new String[n*2];
s[0]="(";
gene(s,1,0,n*2,l);
return l;
}
Update 2015/08/20: 上面的思路正确但是写的太复杂了,我找到了一个简单的算法
public class Solution {
private void helper(List<String> ans, String path, int left, int right) {
if (left == 0 && right == 0) {
ans.add(path);
return;
}
// add either left or right parenthese
if (left > 0) {
helper(ans, path + "(", left - 1, right);
}
if (right > left) {
helper(ans, path + ")", left, right - 1);
}
}
public List<String> generateParenthesis(int n) {
List<String> ans = new ArrayList<String>();
if (n == 0) {
return ans;
}
helper(ans, "", n, n);
return ans;
}
}