result = []
def backtrack(路径, 选择列表):
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(路径, 选择列表)
撤销选择
class Solution {
private:
string s, track;
vector<string> res;
unordered_map<char, string> M = {
{'2', "abc"}, {'3', "def"}, {'4', "ghi"}, {'5', "jkl"},
{'6', "mno"}, {'7', "pqrs"}, {'8', "tuv"}, {'9', "wxyz"},
};
void backtrack(string track, int index){
if(index == s.size()){
res.push_back(track);
return;
}
for(int i = 0; i < M[s[index]].size(); i++){
track.push_back(M[s[index]][i]);
backtrack(track, index+1);
track.pop_back();
}
}
public:
vector<string> letterCombinations(string digits) {
s = digits;
if(s.size()) backtrack(track, 0);
return res;
}
};
class Solution {
private:
int num;
string track;
vector<string> res;
void backtrack(string track, int left, int right){
if(right == num){
res.push_back(track);
return;
}
if(left < num){
track.push_back('(');
backtrack(track, left+1, right);
track.pop_back();
}
if(left > right){
track.push_back(')');
backtrack(track, left, right+1);
track.pop_back();
}
}
public:
vector<string> generateParenthesis(int n) {
num = n;
backtrack(track, 0, 0);
return res;
}
};
class Solution {
private:
int tg;
vector<int> can, track;
vector<vector<int>> res;
void backtrack(vector<int>& track, int index, int sum){
if(sum >= tg){
if(sum == tg) res.push_back(track);
return;
}
for(int i = index; i < can.size(); i++){
sum += can[i];
track.push_back(can[i]);
backtrack(track, i, sum);
sum -= can[i];
track.pop_back();
}
}
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
tg = target;
can = candidates;
if(can.size()) backtrack(track, 0, 0);
return res;
}
};