leetcode 22 括号生成
一、题目描述
二、解题思路
整体思路
模拟画出解题的决策树,我们可以采用回溯+剪枝来解决这个问题。
具体思路
(1)剪枝策略:
<1>当左括号'('数大于n,生成的path不合法,进行剪枝;
<2>当右括号')'数大于左括号数,生成的path不合法,进行剪枝;
(2)函数功能:dfs函数用于找出括号数为n,左括号数为left,右括号数为right所有有效的括号组合 ;
(3)递归出口:当path.size()==2*n,将path加入ret,再return;
(4)函数体:处理当前节点,可以添加'('和')'。
<1>添加左括号。若left<n,将'('加入path,dfs递归处理left+1的后续情况,处理后恢复现场;
<2>添加右括号。若left>right,将')'加入path,dfs递归处理right+1的后续情况,处理后恢复现场;
三、代码实现
class Solution {vector<string> ret;string path;
public:vector<string> generateParenthesis(int n) {dfs(0,0,n);return ret;}void dfs(int left,int right,int n){//递归出口if(path.size()==2*n){ret.push_back(path);return ;}//剪枝:左括号数大于nif(left<n){path.push_back('(');dfs(left+1,right,n);//恢复现场path.pop_back();}//剪枝:右括号大于左括号数if(left>right){path.push_back(')');dfs(left,right+1,n);//恢复现场path.pop_back();}}
};