【LeetCode 52】17.电话号码的字母组合
一、题意
二、解答过程
理解本题后,要解决如下三个问题:
- 数字和字母如何映射==用
map
或者二维数组
即可 - 两个字母就两个for循环,三个字符我就三个for循环,以此类推,然后发现代码根本写不出来==
回溯算法可解决n个for循环的问题
- 输入1 * #按键等等异常情况
回溯三部曲:
- 确定参数
- 确定终止条件
- 确定单层递归逻辑
class Solution {
private:
const string letterMap[10]={
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs", // 7
"tuv", // 8
"wxyz", // 9
};
public:
vector<string>result;
string s;
//1.
void backtracking(const string& digits,int index)
{
//2.
if(index==digits.size())
{
result.push_back(s);
return;
}
int digit=digits[index]-'0';//将index指向的数字转换为int型
string letters=letterMap[digit];//获取数字对应的字符集
for (int i = 0; i < letters.size(); i++)
{
/* code */
s.push_back(letters[i]);//处理
backtracking(digits,index+1);//递归,注意index+1,下一层要处理下一个数字了
s.pop_back();//回溯
}
}
vector<string> letterCombinations(string digits) {
s.clear();
result.clear();
if(digits.size()==0)
{
return result;
}
backtracking(digits,0);
return result;
}
};