题意
求出所有由n对括号组成的合法括号序列。
思路
我们可以发现,对于一个合法的括号序列,任意一个右括号都一定和前面的一个的左括号配对。因此对于任意一个合法的括号序列,任一时刻其右括号数量一定小于等于左括号。由此,我们可以搜索括号序列并储存所有合法的括号序列,代码如下。
class Solution {
public:
/**
*
* @param n int整型
* @return string字符串vector
*/
int N;
vector<string> ans;//存储括号序列所用数组
void dfs(string now,int right,int left)
{
if(right == left && right == N) ans.push_back(now);//若括号序列合法。存入答案数组
if(right < left) return;//若右括号多于左括号,一定不合法,剪枝
if(right < N) dfs(now+"(",right+1,left);//添加右括号
if(left < N) dfs(now+")",right,left+1);//添加左括号
}
vector<string> generateParenthesis(int n) {
// write code here
N=n;
dfs("",0,0);//开始深搜
return ans;
}
};
复杂度分析
时间复杂度:,为括号序列的总方案数。
空间复杂度:,为存储括号序列所用空间。