Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在拨号板上查找所有可能拼写为电话号码的单词的逻辑_Java_Search_Combinations - Fatal编程技术网

Java 在拨号板上查找所有可能拼写为电话号码的单词的逻辑

Java 在拨号板上查找所有可能拼写为电话号码的单词的逻辑,java,search,combinations,Java,Search,Combinations,因此,我必须找到所有可能的组合,这些组合可以使用拨号盘上为每个号码指定的字母拼写电话号码。ie:2226262能拼出“香蕉” 给定任何长度小于8的数字,我可以找到一个匹配整数的所有单词。也就是说,findWholeWord(dictionary[2],723)将给我一个字符串数组{“RAD”,“RAE”,“RAF”,“SAD”,“SBF”,“PAE”,“PAD”}(给我的字典有点傻…)。我的字典分为7个部分,每个部分包含相同长度的单词 我不确定的是如何取一个7位数字并给出所有的单词组合,比如一个

因此,我必须找到所有可能的组合,这些组合可以使用拨号盘上为每个号码指定的字母拼写电话号码。ie:2226262能拼出“香蕉”

给定任何长度小于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)等等


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

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

  • 对您拥有的词典执行预处理任务,以便为每个词典中的每个单词创建一个简单数据结构中的等效数字(即,对于“香蕉”给出“226262”)
  • 将这些字典存储在一个由7个表组成的数据库中(每个单词长度一个表),这些表由“word”字段索引,这样您就可以在程序运行时再次读取它们
  • 创建一个接受给定数字“22226262”并返回字符串ArrayList的方法。对于N=1到7;取前N个数字,并使用您拥有的数字在“N表”中搜索可能的单词。对于您得到的每个可能的单词,使用每个单词的其余数字再次调用相同的方法(即,如果一个单词有3个字符,则使用最后4个数字调用该方法)。创建一个新的字符串ArrayList,然后添加从这些调用中获得的所有结果,并返回它
  • 确保为该递归设置终止条件以避免“无限递归”。我建议在方法的开头检查给定的数字是否为零长度,如果是,只需返回一个空字符串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;
    }
    
    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)”。这非常简单。有关更多信息,您可以看到: