题目
括号。设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合。
说明:解集不能包含重复的子集。
例如,给出 n = 3,生成结果为:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
解题
方法一:回溯
用left,right两个变量去控制,左括号和右括号数
用if(c=='(') backtracing(n,left+1,right);
保证左括号的优先。
class Solution { public: vector<char> sign={'(',')'}; string path; vector<string> res; void backtracing(int n,int left,int right){ if(left>n||right>n||left<right) return; if(left==n&&right==n){ res.push_back(path); return; } for(char c:sign){ path.push_back(c); if(c=='(') backtracing(n,left+1,right);//优先左括号 else backtracing(n,left,right+1); path.pop_back(); } } vector<string> generateParenthesis(int n) { backtracing(n,0,0); return res; } };