一、组合总和
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
分析如下:
构造树形结构如下图所示:
代码如下:
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(int n,int k,int sum,int startIndex)
{
if(path.size()==k)
{
if(sum==n)
result.push_back(path);
return;
}
for(int i=startIndex;i<=9;i++)
{
sum+=i;//处理
path.push_back(i);//处理
backtracking(n,k,sum,i+1);//递归
sum-=i;//回溯
path.pop_back();//回溯
}
}
vector<vector<int>> combinationSum3(int k, int n) {
backtracking(n,k,0,1);
return result;
}
};
二、电话号码中的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
分析如下:
例如:输入:"23",抽象为树形结构,如图所示:
代码如下:
class Solution {
public:
string lettermap[10]=
{
"",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz"
};
vector<string> result;
string s;
void backtracking(string digits,int index)
{
if(index==digits.size())
{
result.push_back(s);
return;
}
int digit=digits[index]-'0';
string letters=lettermap[digit];
for(int i=0;i<letters.size();i++)
{
s.push_back(letters[i]);
backtracking(digits,index+1);
s.pop_back();
}
}
vector<string> letterCombinations(string digits) {
if(digits.size()==0)
return result;
backtracking(digits,0);
return result;
}
};
注意:输入1 * #按键等等异常情况
代码中最好考虑这些异常情况,但题目的测试数据中应该没有异常情况的数据,所以我就没有加了。
但是要知道会有这些异常,如果是现场面试中,一定要考虑到!
并且当输入字符串长度为0时候,需要单独处理返回result