2023.9.24
看到组合两个字,想到了回溯。 大致思路是将所有可能的组合列出来,通过中止条件筛选掉无效的括号。 第一个中止条件:如果右括号数量大于左括号,那括号肯定无效。 第二个中止条件:当左右括号数量相等,并且都等于n时,说明这个括号符合条件,加入ans数组中,再return继续寻找。 图示和代码如下:
class Solution {
private://全局变量vector<string> 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<string> generateParenthesis(int n) {backtrating(n,0,0);return ans;}
};