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对括号,找到所有合理组合,比如"(()))()("是不合理的。
解析:首先,要想解这个题,首先要明白一件事情,n对括号组成的合理字符串有一个特点:任一字符的前面所有字符中“(”数量大于等于“)”的数量,只要满足这个条件,就是一个合理字符串,这也是我们求解这个问题时的关键条件。假设字符串tmp是一个满足条件的字符串,我们现在要加一个新的字符串进去,怎样判断加进去之后是否符合条件呢,因此需要两个计数器记录目前为止出现过几个“(”和几个“)“。
其次,如果出现了“)”多于“(”的情况要如何恢复成少于的情况呢,因为字符是一个一个加上去的,所以多的时候也顶多多了一个,也肯定是最后一个,所以最后一个换成“(”就好了。回溯法正好适用这种问题。
代码实现:
class Solution
{
public:
vector<string> generateParenthesis(int n)
{
vector<string> ret = vector<string>();
if (n == 0)
return ret;
string tmp = "";
help(ret, tmp, n, n);
return ret;
}
void help(vector<string> &ret,string tmp,int m,int n)
{
if (m < 0 || n < 0 || m > n)
return;
if (m == 0 && n == 0)
{
ret.push_back(tmp);
return;
}
help(ret, tmp + '(', m - 1, n);
help(ret, tmp + ')', m, n - 1);
}
};