LeetCode中国,https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/。
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
输入:"23" 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
LeetCode 给出本题难度中等。一个回溯算法题目。
就是根据提供的数据,分解出所有可能的字符串。
如同样例,输入 23。我们知道 2 对应的字母有 abc,3 对应的字母有 def。这样,我们可以构造出如下图所示的树。
因此 23 对应的可能是 3*3=9 种,即 ad,ae,af,bd,be,df,cd,ce,cf 这九种。
1、构造数字和字符串的关系对应表。
2、遍历输入的数字字符串,依据关系对应表,进行搜索和回溯。
我们可以用一个非常简单的数组来构造,如下所示:
vector relation = {
" ", /*数字0*/
"", /*数字1*/
"abc", /*数字2*/
"def", /*数字3*/
"ghi", /*数字4*/
"jkl", /*数字5*/
"mno", /*数字6*/
"pqrs", /*数字7*/
"tuv", /*数字8*/
"wxyz" /*数字9*/};//数字和字母关系
每次搜索的时候,进行查表即可。
老样子,先写搜索函数的模板。然后根据题目思考需要几个输入参数。
1、当前构造出来的字母字符串,名字为 path。
2、用户输入的数字字符串,名字为 digits。
3、已经搜索到第几位,名字为 idx。
因此,我们可以写出这个搜索函数的原型如下:
void dfs(string path, string digits, int idx)
就是 idx 和数字字符串 digits 的长度相等。
经过这样分析,我们就可以套用搜索回溯模板程序写出个大概。然后再调试一下即可。
class Solution {
public:
vector ans;//答案
vector relation = {
" ",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz"};//数字和字母关系
vector letterCombinations(string digits) {
if (0==digits.length()) {
//特例处理
return vector();
}
string path;
dfs(path, digits, 0);
return ans;
}
void dfs(string path, string digits, int idx) {
//返回条件
if (idx==digits.length()) {
ans.push_back(path);
return;
}
//获取当前数字对应的字符串
string str = relation[digits[idx]-'0'];
for (int i=0; i