题目描述
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例:
输入:n = 3
输出:[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
解题思路
这道题只能基于深度优先搜索的方法来进行,问题在于如何优化。
给定长度的括号对数,生成的字符串长度是相同的。并且,字符串只能由'('
和‘)'
组成,所以,进行深度优先遍历的时候每一层最多只有两个选择。
我们当然可以每层都枚举这两个选择,最终生成的组合就枚举了所有的可能,但是会出现大量的无效的组合,优化算法就是要在这个过程中避免生成无效的组合。
具体而言:
- 如果当前
'('
的数量和')
的数量相同,那么就不能在接下来的一个字符串中枚举')
字符,那样必然生成无效的组合。 - 如果剩余的搜索深度不足以使得
')'
和'('
相等,即当前的'(
的数量达到了临界值,之后的字符必须都是')
才能使得括号匹配
在搜索的过程中,每一层的搜索都要检查上述的两点,这样就可以在搜索的过程中避免所有的无效组合。
代码
class Solution
{
public:
vector<string> generateParenthesis(int n)
{
auto res = get(0, 2 * n);
vector<string> ans(res.size());
int idx = 0;
for (auto i : res)
{
ans[idx++] = i;
}
return ans;
}
list<string> get(int flag, int n)
{
if (n == 0)
return {""};
list<string> ans;
if (flag > 0)
{
auto res = get(flag - 1, n - 1);
string nstr = ")";
for (auto i : res)
{
ans.push_back(nstr + i);
}
}
if (flag < n)
{
auto res = get(flag + 1, n - 1);
string nstr = "(";
for (auto i : res)
{
ans.push_back(nstr + i);
}
}
return ans;
}
};