题目大意就是:手机上的九键建立了一个数字和字母的对应关系,一个数字可能对应多个字母。输入一串数字,每个数字用一个它对应的某个字母代替,这一串数字就转化成了一串字母,输出所有可能的字母。
这道题用DFS搜索就可以求解了。以输入“232”为例。
2对应a,b,c三个字母。3对应着d,e,f 这三个字母。
首先是第一层数字2,第一层为数字2对应的第一个字母a
接着到第二层数字3,第二层为数字3对应的第一个字母d
接着到第三层数字2,第三层为最后一层,2对应的字母分别与ad组合:ada,adb,adc。
返回到第二层,第二层改为数字3对应的第二个字母e
再到第三层,第三层为最后一层,2对应的字母分别与ae组合:aea,aeb,aec
以此类推
求解代码:
class Solution {
public:
static map< char,string > letter_map;
static map< char,string > init_lettermap();
vector<string> ret;
vector<string> letterCombinations(string digits) {
ret.clear();
if(digits=="") return ret;
letterCombinations(digits,0,"");
return ret;
}
void letterCombinations(const string &digits,int layer,string s);
};
void Solution::letterCombinations(const string &digits,int layer,string s){
string v=letter_map.at(digits[layer]);//第layer层对应的vector<string>
//cout<<"layer="<<layer<<" s="<<s<<endl;
//cout<<"v="<<v<<endl;
if( layer==(int)(digits.size()-1) ){
//if(digits[layer]=='1') ret.push_back(s);
for(int i=0;i<(int)v.size();++i){
string tmp(1,v[i]);
ret.push_back(s+tmp);
}
}else{
//if(digits[layer]=='1') letterCombinations(digits,layer+1,s);
for(int i=0;i<(int)v.size();++i){
string tmp(1,v[i]);
letterCombinations(digits,layer+1,s+tmp);
}
}
}
map< char,string> Solution::init_lettermap(){
map<char,string> m;
m['1']="*";
m['2']="abc";
m['3']="def";
m['4']="ghi";
m['5']="jkl";
m['6']="mno";
m['7']="pqrs";
m['8']="tuv";
m['9']="wxyz";
return m;
}
map<char,string> Solution::letter_map=Solution::init_lettermap();