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;
}
};