目录
问题描述:
实现代码与解析:
回溯:
原理思路:
问题描述:
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = "23" 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = "" 输出:[]
示例 3:
输入:digits = "2" 输出:["a","b","c"]
实现代码与解析:
回溯:
class Solution {
public:
//将数字与字母建立对应关系
unordered_map<char,string> phoneMap
{
{'2',"abc"},
{'3',"def"},
{'4',"ghi"},
{'5',"jkl"},
{'6',"mno"},
{'7',"pqrs"},
{'8',"tuv"},
{'9',"wxyz"}
};
string s;//结果
vector<string> result;//接受结果
void backtrack(string digits,int index)
{
if(s.size()==digits.size())
{
result.push_back(s);
return;
}
char num=digits[index];//该层遍历的数字
string letter=phoneMap[num];//该层需要遍历的数字对应的字母组合
for(int i=0;i<letter.size();i++)
{
s.push_back(letter[i]);
backtrack(digits,index+1);//递归
s.pop_back();//回溯
}
return;
}
vector<string> letterCombinations(string digits)
{
if(digits.empty()) return result;//为空时
backtrack(digits,0);
return result;
}
};
原理思路:
1、首先是写出数字和字母的映射关系,这里我们用的哈希表,当然也可以用数组,下面给出,只不过在索引位置为0和1的位置设置为空就可以了。
const string letterMap[10] =
{
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs", // 7
"tuv", // 8
"wxyz", // 9
};
2、然后我们开始递归,确定终止条件,显然就是把每一个数字对应的字母分别取其中一个组合起来就获取到了结果,所以所以当s的大小等于digits的时候就记录结果,同时返回。
3、 最后就是确定递归逻辑,这里我们要确定每次递归遍历的字母集,用index先找到digits对应数字,然后再用数字找到map中对应的字母集,这样我们就找到了此层要遍历的字母集。
4、不要忘记回溯就可以了,此题和其他回溯题思路相似,只是多了查找对应关系的逻辑。