拿到这道题目的时候,要列出所有括号的组成形式,就想到用递归的方法求解这个题目。
此题的思路是:left :表示的剩余的左括号的个数,right:表示剩余的有括号的个数。当左括号的个数和有括号的个数都等于的时候,表示此时括号得到了正确的匹配。如果某个时候,递归到左括号的个数大于有括号的个数,就会出现")(",这样的字符串,这是一种不合法的写法。另外一种情况就是当左括号大于0,给当前的字符串加一个左括号,当当前的右括号的个数大于0,就在当前的字符串的括号加一个有括号。
之前还想了一种递归的方法,写着写着就没思路了,哈哈哈,很尴尬的呢。废话少说,上段代码呗:)
class Solution {
private:
void dpfun(int left,int right,string current,vector<string>&result)
{
if(left > right) return;
if(left ==0 && right==0) return result.push_back(current);
if(left>0) dpfun(left-1,right,current+"(",result);
if(right>0) dpfun(left,right-1,current+")",result);
}
public:
vector<string> generateParenthesis(int n) {
vector<string> result;
dpfun(n,n,"",result);
return result;
}
};
另外一种解法,是在网上copy看的,方法不错。其思路是这样的:当遇到一个左括号的时候,就插入一对括号,还有总是在这个表达式前加一对括号,这就列出来所有的情况,其中可能会产生重复的情况,然后我们可以用set集合。
class Solution {
public:
vector<string> generateParenthesis(int n) {
set<string> tmp;
if(n == 0)
tmp.insert("");
else
{
vector<string>pre = generateParenthesis(n-1); //保存之前产生的结果数组
for(int i = 0;i<pre.size();i++)
{
string a = pre[i];
for(int j = 0;j<a.length();j++)
{
if(a[j] == '(')
{
a.insert(a.begin() + j + 1, '(');
a.insert(a.begin() + j + 2, ')');
tmp.insert(a);
a.erase(a.begin() + i + 1, a.begin() + i + 3);
}
}
}
tmp.insert("()");
}
return vector<string>(tmp.begin(),tmp.end());
}
};