典型的递归。一步步构造字符串。当左括号出现次数<n时,就可以放置新的左括号。当右括号出现次数小于左括号出现次数时,就可以放置新的右括号。
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> result;
string path;
dfs(n, 0, 0, path, result);
return result;
}
void dfs(int n, int l, int r, string path, vector<string> &result)
{
if(l==n)
{
result.push_back(path.append(n-r, ')'));
return;
}
else
{
dfs(n, l+1, r, path+"(", result);
if(l > r)
dfs(n, l, r+1, path+")", result);
}
}
};
9.06 用DP效率更高啊。1D DP。
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> result[n+1];
result[0] = vector<string>(1, "");
result[1] = vector<string>(1, "()");
if(n < 2) return result[n];
for(int length=2; length <= n; length++)
{
for(int innerLength=0; innerLength<length; innerLength++)
{
int outterLength = length-1-innerLength;
for(auto in: result[innerLength])
{
for(auto out: result[outterLength])
{
result[length].push_back("("+in+")"+out);
}
}
}
}
return result[n];
}
};