考虑到10位数的电话号码,我们必须打印从中创建的所有可能的字符串。数字的映射正好在手机的键盘上。
即。对于1,0->没有信 对于2-> A,B,C
例如,1230 ADG BDG CDG AEG ....
这个问题在c / c ++中是最好的解决方案吗?
答案 0 :(得分:2)
我认为递归解决方案对这个问题有好处。如下所示:
def PossibleWords(numberInput, cumulative, results):
if len(numberInput) == 0:
results.append(cumulative)
else:
num = numberInput[0]
rest = numberInput[1:]
possibilities = mapping[num]
if len(possibilities) == 0:
PossibleWords(rest, cumulative, results)
else:
for p in possibilities:
PossibleWords(rest, cumulative + p, results)
result = []
PossibleWords('1243543', '', result)
答案 1 :(得分:1)
无需递归。以下是一个开始的迭代方法的示例。它打印出所有可能性,但你可能不完全喜欢它的行为。这个问题留待读者去发现; - )
string tab[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
string s="1201075384"; //input string
for(int mask=0;mask<1048576;mask++)//4^10, trying all the posibilities
{
int m=mask;
string cur="";
for(int i=0;i<s.size();i++,m/=4)
if (m%4<tab[s[i]-'0'].size())
cur+=tab[s[i]-'0'][m%4];
cout<<cur<<endl;
}
答案 2 :(得分:1)
Smashery的python解决方案的C ++版本:
string getMapping(int num){
assert(num>=2 && num<=9);
switch(num){
case 2:
return "ABC";
case 3:
return "DEF";
case 4:
return "GHI";
case 5:
return "JKL";
case 6:
return "MNO";
case 7:
return "PRS";
case 8:
return "TUV";
case 9:
return "WXY";
default:
return " ";
}
}
// Recursive function
void generateWords(string input, string cumulative, vector<string> &result){
if(input.length() == 0){
result.push_back(cumulative);
}
else{
int num = input.at(0) - '0';
string rest = input.substr(1, input.length()-1);
string mapString = getMapping(num);
if(mapString.compare(" ") != 0){
for(int i=0; i<mapString.length(); i++){
generateWords(rest, cumulative+mapString.at(i), result);
}
}
else{
assert(1==0);
}
}
}
void process(){
generateWords("4734", "", words);
}