
看到组合两个字,想到了回溯。 大致思路是将所有可能的组合列出来,通过中止条件筛选掉无效的括号。 第一个中止条件:如果右括号数量大于左括号,那括号肯定无效。 第二个中止条件:当左右括号数量相等,并且都等于n时,说明这个括号符合条件,加入ans数组中,再return继续寻找。 图示和代码如下:

- class Solution {
- private:
- //全局变量
- vector
ans; - string path;
- public:
- void backtrating(int n,int left,int right) //left和right是左右括号的数量
- {
- //中止条件
- if(right > left) return;
- if(left == right && left == n)
- {
- ans.push_back(path);
- return;
- }
- //优先加左括号
- if(left < n)
- {
- path += '(';
- backtrating(n,left+1,right);
- path.pop_back();
- }
- //加右括号
- if(left > right)
- {
- path += ')';
- backtrating(n,left,right+1);
- path.pop_back();
- }
- }
- vector
generateParenthesis(int n) { - backtrating(n,0,0);
- return ans;
- }
- };