【问题标题】:Logic for finding all possible words that can be spelled with a phone number on a dial pad查找所有可以用拨号盘上的电话号码拼写的单词的逻辑
【发布时间】:2012-11-26 05:27:50
【问题描述】:

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

给定任意长度 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) 等等...

也不知道怎么做,不知道哪个更容易,不知道哪个效率最高。

【问题讨论】:

    标签: java search combinations


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      1. 对您拥有的词典执行预处理任务,以便为每个词典中的每个单词在一些简单的数据结构中创建等效数字(即,对于“BANANA”,给出“226262”)。
      2. 将这些字典存储在由“Word”字段索引的 7 个表(每个字长一个表)的数据库中,以便您可以在程序运行时再次读取它们。
      3. 创建一个接受给定数字“2226262”并返回字符串ArrayList 的方法。对于 N = 1 到 7 ;取第一个 N 位数字并使用您拥有的数字在“N 表”中搜索可能的单词。对于您得到的每个可能的单词,使用每个单词的其余数字再次调用相同的方法(即,如果 Word 是 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;
      }
      

      【讨论】:

      • 我有 1 和 2 下来(我实际上做的是我使用 Arrays.sort 和自定义比较器根据数值对字典进行排序;然后我通过将字典转换为那些数字(现在按升序排列)并使用 Arrays.binarySearch 进行二进制搜索)。但是,我不确定的是 3 和 4。我对你的意思有一个模糊的概念,但我不确定细节。
      • 好的,我很确定我理解逻辑,尤其是定义 possibleWords 和 restOfPossibleWords 的行。不幸的是,我对 ArrayLists 完全不熟悉。这需要大量修改才能仅使用数组吗?
      • 我想不出一个简单的切换相同的逻辑来使用数组而不是数组列表。使用 ArrayLists 非常容易!您可以按以下方式创建它们:“ArrayList allPossibleWords = new ArrayList();”并将项目添加为“allPossibleWords.add(item);”并且您使用上述增强的 for 传递它的项目,最后如果您想获得元素“i”,您只需编写“allPossibleWords.get(i)”。这真的很简单。更多内容可以看:javarevisited.blogspot.com/2011/05/…
      猜你喜欢
      • 1970-01-01
      • 2013-04-13
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多