1

因此,我必须使用为拨号盘上的每个号码分配的字母,找到可以与电话号码拼写的所有可能组合。即: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) 等等...

不知道怎么做,不确定哪个更容易,不确定哪个最有效。

4

2 回答 2

0

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

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

我希望我的观点清楚

更新

这是我所说的 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;
}
于 2012-11-26T06:36:09.540 回答
0

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

于 2012-11-26T06:38:24.007 回答