打印从数字创建的可能字符串
Posted
技术标签:
【中文标题】打印从数字创建的可能字符串【英文标题】:Print possible strings created from a Number 【发布时间】:2009-11-13 04:24:12 【问题描述】:给定一个 10 位数的电话号码,我们必须打印由此创建的所有可能的字符串。数字的映射与手机键盘上的完全一样。
即对于 1,0-> 无字母 对于 2-> A,B,C
例如,1230 助理总干事 BDG *** 电动枪……
c/c++ 中这个问题的最佳解决方案是什么?
【问题讨论】:
这里所说的“编程风格”是什么意思? 家庭作业?如果它确实标记它,请 这不是作业。我要求一个好的解决方案来解决这个问题...... 这是一个很常见的 CPSC 类型的问题,您应该可以通过快速的 google 搜索轻松找到各种实现。现在,如果您想对您的尝试提出建设性建议,请发布,我们可以提供帮助。 我不知道如何解决这个问题。我正在准备工作面试。任何发出的光将不胜感激 【参考方案1】:我认为递归解决方案对这个解决方案有好处。所以像:
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)
【讨论】:
您的意思是将结果作为递归调用的第三个参数传递给 PossibleWords() 吗? 你能举个c或c++的例子吗? 您只是要求一个好的解决方案来解决这个问题。如果这不是家庭作业问题,为什么需要 c 或 c++ 中的特定示例? Python 与伪代码一样接近。我建议自己解决。 @Suppressingfire - 谢谢!是的,初始代码存在一些问题。我现在已经对其进行了测试,似乎一切正常。 @Ari:那么你也打算在 SO 上假装自己的工作吗?【参考方案2】:无需递归。这是一个迭代方法的示例。它会打印出所有可能性,但您可能并不完全喜欢它的行为。问题留给读者去发现;-)
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;
【讨论】:
【参考方案3】: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);
【讨论】:
以上是关于打印从数字创建的可能字符串的主要内容,如果未能解决你的问题,请参考以下文章