2.代码及注释
class Solution { public: //存放结果的容器,初始化为空 vector<string> ans{}; //回溯算法 left为‘(‘的个数 right为‘)‘的个数,s为当前的字符串,k为当前字符串的长度,n为目标字符串的长度。 void back_track(string s,int k,int n,int left,int right){ /* 回溯剪枝 由有效的括号组成性质可知 1.左右括号个数各占总体的一半,如果左右括号个数超出一半则必定是无效的 2.左括号个数必定是大于右括号个数的 */ if(left>n/2||right>n/2) return ; if(right>left) return ; //当进行到最后一个时,则认为是有效的括号,并加入容器 if(k==n){ ans.push_back(s); }else{ string temp = s; //添加‘(‘ s+=‘(‘; back_track(s,k+1,n,left+1,right); //添加‘)‘ s=temp+‘)‘; back_track(s,k+1,n,left,right+1); } return ; } vector<string> generateParenthesis(int n) { if(n==0) return {""}; back_track("(",1,n*2,1,0); return ans; } };
原文:https://www.cnblogs.com/moumangtai/p/12134525.html