classSolution{publicList<String>generateParenthesis(int n){/**1. 如何确保不重复:画格子,走不同分枝肯定至少有一个格子不同。如下[x][x][o][x][x][x][o][o]也就是无论如何,不同分枝代表的字符串内容肯定不相同。2. 如何跑全:因为包括了所有左右括号组合。*/ArrayList<String> ans =newArrayList<>();dfs(ans, n, n,"");return ans;}// ans(存储答案);left(左括号剩余数);right(右括号剩余数);now(当前字符串)publicvoiddfs(ArrayList<String> ans,int left,int right,String now){// 递归结束if(left ==0&& right ==0){ans.add(now);}// 剪枝情况:如")",肯定是错误顺序。if(right < left){return;}// 走左括号路线if(left >0){dfs(ans, left -1, right, now +"(");}// 走右括号路线if(right >0){dfs(ans, left, right -1, now +")");}return;}}