LeetCode题解——17. 电话号码的字母组合
题目相关
题目链接
LeetCode中国,。
题目描述
给定一个仅包含数字 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<string> 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 的长度相等。
AC 参考代码
经过这样分析,我们就可以套用搜索回溯模板程序写出个大概。然后再调试一下即可。
class Solution { public: vector<string> ans;//答案 vector<string> relation = { " ", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};//数字和字母关系 vector<string> letterCombinations(string digits) { if (0==digits.length()) { //特例处理 return vector<string>(); } 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<str.length(); i++) { path.push_back(str[i]);//搜索 dfs(path, digits, idx+1); path.pop_back();//回溯 } } };