17. Letter Combinations of a Phone Number
Medium
2516330FavoriteShare
Given a string containing digits from 2-9
inclusive, return all possible letter combinations that the number could represent.
A mapping of digit to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters.
Example:
Input: "23" Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.
Accepted
435,566
Submissions
1,018,744
这道题还是简单说一下,开头一直想得是求 [a,b,c] [d,e,f] 的全组合,然后减去,单个列表的组合,就是所得结果,这样理论上也是可行,但是仅仅针对此题目,比如减去a,b,c的组合,减去d,e,f的组合,实则计算量回随着列表的增加,无限累加,写了200行遂放弃了,思路还是错了,最后看懂别人的解法仔细思考,才发现别人的解法是多么灵活。
难点:本题的难点在于数字字符串的长度是个变量,若是一个固定的几位数,那么就可以写几重循环,依次输出即可。
关键点:通过递归的方式,制造每一个分支,例如:数字字符串“234”,第一个列表["a","b","c"],将第二个小列表["d","e","f"]与其组合,即得到["ad","ae","af","bd","be","bf","cd","ce","cf"]。本质上是一个树形结构,即
a 对应 {ab, ae, af};
b 对应 {bd, be, bf};
c对应 {cd, ce, cf};
每一个结果都是最终的叶子节点。而且这是一个满二叉树,父节点a ,b , c。
通过递归的方式模拟满二叉树。输出叶子节点即可。
注意,每一次递归代表一个独立的分支,不可与其他分支有关系。
#include <iostream>
#include <vector>
#include <map>
#include <stdlib.h>
#include <string.h>
using namespace std;
class Solution {
public:
vector<string> letterCombinations(string digits) {
string tar = "";
int len = digits.length();
int ret = find_result(digits, tar, 0, len);
return m_arr_result;
}
int find_result(const string &src,string tar, int index,int len){
if(len==0){
return -1;
}
/* 判断组合长度*/
if(index==len){
cout<<tar<<endl;
m_arr_result.push_back(tar);
return 0;
}
/* 获取"23" */
char str_arr[10]={0};
memset(str_arr,0x00,sizeof(str_arr));
strcpy(str_arr, src.c_str());
/* 获取'2' */
char single_c = str_arr[index];
string son_value = telphone_map[single_c]; //abc or def
char son_arr[10] = {0};
memset(son_arr,0x00,sizeof(son_arr));
strcpy(son_arr, son_value.c_str());
/* 每次进入一个分支,即从父节点进入子节点 */
for(int i=0;i<son_value.length();i++){
find_result(src, tar+son_arr[i], index+1, len);
}
return 0;
}
private:
vector<string> m_arr_result;
map<char, string> telphone_map{ { '1', "" },{ '2', "abc" },
{ '3', "def" },{ '4', "ghi" },
{ '5', "jkl" },{ '6', "mno" },
{ '7', "pqrs"},{ '8', "tuv" },
{ '9', "wxyz" }};
};
int main(){
Solution *pnew = new Solution();
pnew->letterCombinations("23");
system("pause");
return 0;
}