第一题
216.组合总和III
递归法:
class Solution {
public:
vector<vector<int>> out;
vector<int> vec;
void traversal(int k, int n, int s_index, int sum){
if(sum > n) return;
if(vec.size() == k && sum == n){
out.push_back(vec);
return;
}
for(int i = s_index; i <= 9; i++){
sum += i;
vec.push_back(i);
traversal(k,n,i+1,sum);
sum-= i;
vec.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
traversal(k,n,1,0);
return out;
}
};
第二题
17.电话号码的字母组合
递归法:
class Solution {
public:
const string letter[10] = {//放入电话里数字对应的字符串
"",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz",
};
vector<string> out;
string s;
void traversal(const string& digits, int index){
if(index == digits.size()){
out.push_back(s);
return;
}
int d = digits[index] - '0';//将字符串中的字符转为数字
string d_letters = letter[d];//找到这个数字对应的字符串
for(int i = 0; i < d_letters.size();i++){//遍历这个字符串
s.push_back(d_letters[i]);
traversal(digits, index+1);//递归但是index+1获取原字符串中的下个数字中的字符串
s.pop_back();//回溯
}
}
vector<string> letterCombinations(string digits) {
if(digits.size() == 0) return out;//字符串的大小为0就是空的
traversal(digits, 0);///递归
return out;
}
};