Java 在拨号板上查找所有可能拼写为电话号码的单词的逻辑
因此,我必须找到所有可能的组合,这些组合可以使用拨号盘上为每个号码指定的字母拼写电话号码。ie:2226262能拼出“香蕉” 给定任何长度小于8的数字,我可以找到一个匹配整数的所有单词。也就是说,Java 在拨号板上查找所有可能拼写为电话号码的单词的逻辑,java,search,combinations,Java,Search,Combinations,因此,我必须找到所有可能的组合,这些组合可以使用拨号盘上为每个号码指定的字母拼写电话号码。ie:2226262能拼出“香蕉” 给定任何长度小于8的数字,我可以找到一个匹配整数的所有单词。也就是说,findWholeWord(dictionary[2],723)将给我一个字符串数组{“RAD”,“RAE”,“RAF”,“SAD”,“SBF”,“PAE”,“PAD”}(给我的字典有点傻…)。我的字典分为7个部分,每个部分包含相同长度的单词 我不确定的是如何取一个7位数字并给出所有的单词组合,比如一个
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)等等
也不知道怎么做,不知道哪一个更容易,也不知道哪一个最有效。我可以想出一个解决方案,但这取决于这些词典是在运行时更新的,还是在开发时修复的。如果这些词典不随时间变化,您可以执行以下操作:
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;
}
ArrayList getWordsOf(字符串编号){
if(Number.isEmpty()){
返回新的ArrayList();
}
ArrayList allPossibleWords=新的ArrayList();
对于(inti=1;i,如果你计算每个索引的字数,而不是尝试所有可能的组合,它可能会节省你的时间。。。
例如,在findWholeWord(字典[2],723];字数[2]=7;
因此,为了清晰起见,让我们得到wordCount[0]=1;wordCount[5]=3;
(我无法想象你得到的是除“A”之外的任何其他1字母单词),这意味着你现在只需要运行1X3组合,而不是7X7组合。这将节省你的子单词匹配一些重要的时间。(我实际做的是使用Arrays.sort和自定义比较器根据数值对字典进行排序;然后将字典转换为这些数字(现在是升序)进行单独搜索,并使用Arrays.binarySearch进行二进制搜索).然而,我不确定的是第3行和第4行。我对你的意思有一个模糊的概念,但我不确定细节。好的,我非常确定我理解逻辑,特别是定义可能单词和可能单词的行。不幸的是,我对ArrayList完全不熟悉。这需要对j进行大量修改吗是否必须使用数组?我想不出一个简单的方法来切换相同的逻辑以使用数组而不是ArrayList。使用ArrayList非常简单!您可以按如下方式创建它们:“ArrayList allPossibleWords=new ArrayList();”并将项添加到其中:“allPossibleWords.add(item);”您可以使用上面的增强for遍历它的项目,最后,如果您想获得元素“i”,只需编写“allPossibleWords.get(i)”。这非常简单。有关更多信息,您可以看到: