描述
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
思路
1.首先肯定能想到暴力穷举的方式:一共有n对括号,即2n个位置,每个位置都有两种括号选择,一共有2的2n次方种情况,枚举完之后再排除不符合的情况。这样时间复杂度会很高。
2.回溯法:回溯法对暴力穷举进行了剪枝,对于某次尝试,若不符合规则,直接返回,不再继续尝试。设置两个变量对左括号和右括号进行计数,若左括号数小于n,则优先放置左括号,当左括号数等于n时不再继续放置,而是放置右括号。每次都要保证已放置的左括号小于n且已放置的左括号数要大于右括号数。
解答
class Solution {
public:
int N = 0;//括号的对数
string tmp_s;//暂时保存字符串
vector<string> res;
vector<string> generateParenthesis(int n) {
N = n;
backTrack(0, 0);
return res;
}
void backTrack(int left, int right){//left、right为左右括号的个数
if (left == N && right == N){//构成一个合法的字符串,保存
res.push_back(tmp_s);
return;
}
if(left < N){//左括号数还不到N,继续放左括号
tmp_s.push_back('(');
backTrack(left + 1, right);
tmp_s.pop_back();
}
if(left > right){//左括号数>右括号数,只能放右括号
tmp_s.push_back(')');
backTrack(left, right + 1);
tmp_s.pop_back();
}
}
};