用于查找可以使用拨号盘上的电话号码拼写的所有可能单词的逻辑

时间:2012-11-26 05:27:51

标签: java search combinations

因此,我必须使用拨号盘上为每个号码指定的字母,找到所有可以使用电话号码拼写的组合。即:222 6262可以拼写“A BANANA”。

给定任何数量的任何长度< 8,我可以找到匹配整数的所有单词。也就是说,findWholeWord(dictionary[2], 723)会给我一个字符串数组{"RAD", "RAE", "RAF", "SAD", "SBF", "PAE", "PAD"}(我给的字典有点笨......)。我的词典分为7个部分,每个部分包含相同长度的单词。

我不确定如何取一个7位数字并给出所有单词组合,例如一个单词长度为6,单词长度为1(6,1),5和2,5和1和1,4和3,4和2和1.我想抛弃任何不覆盖整个单词的东西(0或1的任何东西,3个字母和2个字母的单词与最后2个字母不匹配)。我不知道如何去理解这个逻辑。我很确定这种逻辑有一个名字,因为我绘制了一个树,它有一个很好的模式,但我不知道那个模式被调用了什么或它究竟是什么被调用。

一种方法是找到所有子词并尝试以任何有效的方式将它们组合在一起,另一种方法是尝试所有可能的词长组合:(7),(6,1),(5,2) ),(5,1,1),(4,3),(4,2,1),(4,1,2),(4,1,1,1)等...

不确定如何做,不确定哪个更容易,不确定哪个最有效。

2 个答案:

答案 0 :(得分:0)

我可以想到一个解决方案,但这取决于这些词典是在运行时更新还是在开发时修复。如果这些词典没有随时间变化,您可以执行以下操作:

  1. 对您拥有的词典执行预处理任务,以便对于每个词典中的每个词,您可以在一些简单的数据结构中创建等效数字(即“BANANA”给出“226262”)。
  2. 将这些词典存储在由“Word”字段索引的7个表(每个词长度的表)的数据库中,以便您可以在程序中的运行时再次读取它们。
  3. 创建一个采用给定数字“2226262”并返回String ArrayList的方法。对于N = 1到7;获取前N位数,并使用您拥有的数字在“N表”中搜索可能的单词。对于你得到的每个可能的单词,再次使用每个单词的其余数字调用相同的方法(即如果一个单词是3个字符,则用最后4个数字调用该方法)。创建一个新的String ArrayList并随后添加从这些调用中获得的所有结果,并将其返回。
  4. 确保为此递归设置终止条件以避免“无限递归”。我建议在方法的开头检查给定的数字是否为零长度,如果是,则只返回一个空的String ArrayList。
  5. 我希望我明确指出

    <强>更新

    这是我所说的sudo代码:

    ArrayList<String> getWordsOf(String Number){
        if(Number.isEmpty()){
            return new ArrayList<String>();
        }
        ArrayList<String> allPossibleWords = new ArrayList<String>();
        for(int i=1; i<=Number.length(); i++){
            ArrayList<String> possibleWords = getFromDataBase(Number.substring(0,i));
            ArrayList<String> restOfPossibleWords = getWordsOf(Number.substring(i,Number.length()-i));
            for(String possibleWord:possibleWords){
                for(String restOfPossibleWord:restOfPossibleWords){
                    allPossibleWords.add(possibleWord+" "+restOfPossibleWord);
                }
            }
        }
        return allPossibleWords;
    }
    

答案 1 :(得分:0)

如果你计算每个索引的单词数量,那么它可以节省你的时间,而不是尝试所有可能的组合...... 例如。在findWholeWord(dictionary[2], 723); wordCount[2]=7; 因此,为了清楚起见,我得到wordCount[0]=1; wordCount[5]=3;(我无法想象你得到任何其他1个字母的单词而不是'A'),这意味着你现在必须只运行1X3组合而不是7X7。保存你的子词匹配一些重要的时间。