题目
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例:
输入:n = 3
输出:[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
解题思路比较不一样。。没用dfs等经典解法。
我的思路是:n = 1 的时候,结果为“()”
那么怎么保证括号合法性呢?
索性,我每次直接插入一对“()”,那这样不肯定是合法的吗。
所以,n=2时候,在“()”中插入一对“()”,得到了 “(())”和“()()”
.
.
.
所以,初始为“()”,进行n-1次上述插入操作即可。
但此方法需要使用set去重。
描述的可能不好,大家看代码吧,代码好懂,函数f1就是给当前结果集再插入一对“()”
时间效率不高,但是空间效率很高,其实这种方法有dp那味儿。
还写了一个dfs的版本,那个运行时间0ms,但是空间复杂度比这个高,算是空间换时间吧。
https://blog.csdn.net/HzauTriste/article/details/108256365
class Solution {
public:
void f1(set<string>& res)
{
set<string> temp ;
for(set<string>::iterator i = res.begin();i!=res.end();i++)
{
temp.insert(*i);
}
for(set<string>::iterator i = temp.begin();i!=temp.end();i++)
{
string te = *i;
for(int i=0;i<=te.size();i++)
{
string tee="";
int pos=0;
while(pos<i)
{
tee += te[pos];
pos++;
}
tee += "()";
while(pos<te.size())
{
tee +=te[pos];
pos++;
}
res.insert(tee);
}
}
}
vector<string> generateParenthesis(int n) {
set<string> res;
vector<string> ans;
if(n==1)
{
string a = "()";
ans.push_back(a);
return ans;
}
string a = "()";
res.insert(a);
for(int i =0;i<n-1;i++)
{
f1(res);
}
for(set<string>::iterator i = res.begin();i!=res.end();i++)
{
string t = *i;
if( t.size() == 2*n )
{
ans.push_back(t);
}
}
return ans;
}
};