打印从数字创建的可能字符串

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);


【讨论】:

以上是关于打印从数字创建的可能字符串的主要内容,如果未能解决你的问题,请参考以下文章

从包含以逗号分隔的数字的字符串创建列表;蟒蛇 3

谜题18:字符串奶酪

剑指offer第12题打印从1到n位数以及大整数加法乘法

如何从单个文本文件中同时打印字符串和整数?

剑指offer-面试题17-打印从1到最大的n位数-数字

从数字数组中查找可能的字母字符串数