解法:类似于求括号的全排列,要用回溯法,因为每个位置可以存放左括号或者右括号(统计前面左括号个数,有多少个就可以放多少个右括号),但是需要注意的是,string和char*之间的转换,string可以直接用char数组来初始化的,可以使用char数组或者使用string,并且string s1=“324”;string s2 = s1+“aaa”;s2=“324aaa”,因此在使用string时不需要用引用类型,直接赋值可以调用拷贝构造函数生成新的string类型,但是用char数组时候是需要用指针类型的。
vector<string> generateParenthesis(int n) {
每个位置上可以放左括号和右括号(如果前面左括号的数量大于右括号的数量就可以放置)
第一个位置肯定是左括号,其他位置要进行判断,而且要统计可以加上多少个右括号
vector<string> ret;
if(n==0)return ret;
char p[2*n+1];
p[2*n] = '\0';
generateParentesisCore(n,0,0,p,ret);
return ret;
}
n表示还需要加上多少对括号
rightNum表示还可以加上多少对右括号
void generateParentesisCore(int n,int rightNum,int index,char* p,
vector<string>& ret){
if(n==0 && rightNum==0){
ret.push_back(p);
}
if(n>0){
//可以加上左括号
p[index] = '(';
generateParentesisCore(n-1,rightNum+1,index+1,p,ret);
}
if(rightNum>0){
//可以加上右括号
p[index] = ')';
generateParentesisCore(n,rightNum-1,index+1,p,ret);
}
}
vector<string> generateParenthesis(int n) {
/*
每个位置上可以放左括号和右括号(如果前面左括号的数量大于右括号的数量就可以放置)
第一个位置肯定是左括号,其他位置要进行判断,而且要统计可以加上多少个右括号
使用string试一下
*/
vector<string> ret;
if(n==0)return ret;
string p;
generateParentesisCore(n,0,0,p,ret);
return ret;
}
/*
n表示还需要加上多少对括号
rightNum表示还可以加上多少对右括号
*/
void generateParentesisCore(int n,int rightNum,int index,string p,
vector<string>& ret){
if(n==0 && rightNum==0) ret.push_back(p);
if(n>0) generateParentesisCore(n-1,rightNum+1,index+1,p+"(",ret);
if(rightNum>0) generateParentesisCore(n,rightNum-1,index+1,p+")",ret);
}```