题意: 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:
“((()))”, “(()())”, “(())()”, “()(())”, “()()()”
分析:参见算法导论动态规划一节中矩阵链的问题,n对括号由1+(n-1), 2+(n-2), 3+(n-3)…(n-1)+1构成,用“备忘录”机制将1到(n-1)的情况记录下来,节省调用时所需要的时间。
AC代码:
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<vector<string> > parentheses;
typedef vector<string>::iterator strIter;
for(int i = 1; i < n + 1; ++i){
set<string> temp;
if(i == 1){
temp.insert("()");
}else{
for(int j = 1; j < i; ++j){
for(strIter it_j = parentheses[j - 1].begin(); it_j != parentheses[j - 1].end(); ++it_j){
for(strIter it_j2 = parentheses[i - j - 1].begin(); it_j2 != parentheses[i - j - 1].end(); ++it_j2){
if(j == 1){
temp.insert("(" + *it_j2 + ")");
}
temp.insert(*it_j + *it_j2);
}
}
}
}
vector<string> temp_vec(temp.begin(), temp.end());
parentheses.push_back(temp_vec);
}
return parentheses[n-1];
}
};
题目给的标签是 回溯,还不太会。