Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
For example, given n = 3, a solution set is:
"((()))", "(()())", "(())()", "()(())", "()()()"
做了一些题目之后,发现使用递归的地方和使用回溯的地方也可以使用动态规划来求解,而且动态规划求解更加易于理解和实现,算法的效率更高。
DP[n]=”(“+DP[k]+”)“+DP[n-k-1]; //for k=0:n-1
DP[0]=""
<pre name="code" class="cpp">//递归方法
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> ans;
if(n==0){
string s=""; ans.push_back(s);
return ans;
}
vector<string> s1;
vector<string> s2;
for(int i=0; i<=n-1; i++)
{
s1=generateParenthesis(i);
s2=generateParenthesis(n-i-1);
for(auto k1:s1)
for(auto k2:s2)
{
ans.push_back("("+k1+")"+k2);
}
}
return ans;
}
};
12ms
//DP动态规划求解
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<vector<string>> DP(n+1,vector<string>());
DP[0].push_back("");
for(int i=1; i<=n; i++)
{
for(int k=0; k<i; k++)
{
for(auto k1:DP[k])
for(auto k2:DP[i-k-1])
{
DP[i].push_back("("+k1+")"+k2);
}
}
}
return DP[n];
}
};//4ms