题目分析
1、括号的类型只有()一种,没有{}或者[]
2、括号可以进行多层嵌套
3、有效的括号组合需要满足以下两个条件***(任意一个子串)***:
- 总体上,左括号数量 == 右括号数量
- 从左向右开始数一个子串时,在任意时刻,左括号的数量 >= 右括号数量
4、当我们开始进行生成时,会出现下图所示的过程:
- 当left大于等于n时就不能再添加左括号
- 当right大于等于left时也不能添加左括号
- 当right==n时开始回退***(因为先添加的肯定是左括号,所以后添加的右括号都等于n了,那么左括号应该也满足了)***
普通版本(回溯)
cpp
class Solution {
int left,right,m;
string path;//每一条路径上的最终结果
vector<string> res;//最终结果
public:
vector<string> generateParenthesis(int n) {
m = n;
dfs();//当dfs函数走完后所有的括号就完成了括号的组成
return res;
}
void dfs()
{
if(right == m)
{
res.push_back(path);//将当前组合完成的子串尾插给最终结果
return;
}
if(left < m)//用递归添加左括号
{
path.push_back('(');
++left;
dfs();
path.pop_back();
--left;
}
if(right < left)//添加右括号
{
path.push_back(')');
++right;
dfs();
path.pop_back();
--right;
}
}
};
优化版本(待补充)
~over~