Java 从混乱的字符串中查找单词

Java 从混乱的字符串中查找单词,java,Java,我有一个乱串,如下所示:“ArterarRDrealdac” 我有一个文本文件,其中包含近300000个英语词典单词。我需要找到英语单词,并能够形成如下单词: C A R D A R E A R E A R D A R T 我的意图是在开始时循环遍历加扰的字符串,每次对该文本文件进行查询,并尝试每次匹配4个字符,以查看其是否为有效单词 这个问题是针对每个循环300000个单词进行检查。。要花很长时间。我只把第一个字母循环了16次,这本身就花了很长时间。这种方法带来的可能性似乎无穷无尽。即使我现

我有一个乱串,如下所示:“ArterarRDrealdac”

我有一个文本文件,其中包含近300000个英语词典单词。我需要找到英语单词,并能够形成如下单词:

C A R D
A R E A
R E A R
D A R T
我的意图是在开始时循环遍历加扰的字符串,每次对该文本文件进行查询,并尝试每次匹配4个字符,以查看其是否为有效单词

这个问题是针对每个循环300000个单词进行检查。。要花很长时间。我只把第一个字母循环了16次,这本身就花了很长时间。这种方法带来的可能性似乎无穷无尽。即使我现在不考虑效率问题,我最终也会找到可能不构成单词的英语单词

我的猜测是,我必须解决并找到单词,同时从一开始就以某种方式保持字母的正确结构?几个小时,从快乐到沮丧。请给我一些指导好吗。寻找类似的问题,但没有发现

注意:这是一个示例,我试图将其打开,以容纳更长的字符串或不同大小的正方形。(示例为4x4。用户可以决定使用长度为25的5x5正方形)

我的代码

public static void main(String[] args){
    String result = wordSquareCreator(4, "artearardreardac");
    System.out.println(result);
}


static String wordSquareCreator(int dimension, String letter){



    String sortedWord = "";
    String temp;

    int front = 0;
    int firstLetterFront = 0;
    int back = dimension;


    //Looping through first 4 letters and only changing the first letter 16 times to try a match.
    for (int j = 0; j < letter.length(); j++) {
        String a = letter.substring(firstLetterFront, j+1) + letter.substring(front+1, back);
        temp = readFile(dimension, a);
        if(temp != null){
            sortedWord+= temp;
        }
        firstLetterFront++;
    }

    return sortedWord;
}

static String readFile(int dimension, String word){
    //dict text file contains 300,00 English words
    File file = new File("dict.txt");
    BufferedReader reader = null;

    try {
        reader = new BufferedReader(new FileReader(file));
        String text;

        while ((text = reader.readLine()) != null) {
            if(text.length() == dimension) {
                if(text.equals(word)){
                    //found a valid English word
                    return text;
                }
            }
        }
    }catch (Exception e){
        e.printStackTrace();
    }
    finally {
        try {
            if(reader != null)
                reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    return null;
}
publicstaticvoidmain(字符串[]args){
字符串结果=wordSquareCreator(4,“artearardreardac”);
系统输出打印项次(结果);
}
静态字符串wordSquareCreator(整数维度,字符串字母){
字符串排序词=”;
字符串温度;
int-front=0;
int firstLetterFront=0;
int back=尺寸;
//循环浏览前4个字母,仅更改第一个字母16次以尝试匹配。
对于(int j=0;j
由于您似乎希望从作为函数参数的字母中创建一个单词方块,因此您知道方块中的绝对单词长度是sqrt(amontfletters)。在您的示例代码中,这将是sqrt(16)=4。您还可以直接从词典中取消许多单词的资格:

  • 如果单词不是以字母表中的字母开头(即“a”、“C”、“D”、“e”、“R”、“T”),则丢弃该单词
  • 如果单词长度不等于您的字长(即4),则丢弃该单词
  • 如果某个单词的字母不在你的字母表中,请将其丢弃
  • 您希望在方格中“写入”的字数为字长*2(因为字数只能从上行或左列开始)

    实际上,您可以首先浏览字典,只将有效单词复制到新文件中。然后将你的方块与这本新的较短的字典进行比较


    随着广场的建设,我认为有两种选择

  • 第一种方法是从字母中随机组织正方形,并检查字母是否构成正确的单词

  • 第二种方法是从字典中随机选择“正确”的单词,并将它们写进你的方格中。然后检查单词的数量和字母设置是否正确


  • 如果你正确地组织字典,你可以大大减少你的搜索空间。(这可以在读入文件时完成,无需修改磁盘上的文件。)

    将每个单词长度分成一个列表,然后对每个列表进行排序

    现在,为了减少搜索空间,请注意,单例只能出现在从左上角到右下角的对角线上。你有奇数个C,T,R和A,这4个字母组成了这个对角线。(请注意,您不一定能够做到这一点,因为它们不能保证唯一。)您的搜索空间现在是一组4个选项(24个选项)和一组6个选项(720个选项,除非有重复选项可以减少此限制。)17k个可能的板和1k个字以下(编辑:我最初说的是5K,但是你可以用正确的字母限制空格到单词,因为它是一个排序的列表,你根本不需要考虑其他)。如果你想尝试,你已经有不到2000万种可能需要检查了。你可以通过首先过滤你的单词列表,将其筛选为只包含所用字母的单词,从而大大减少这种可能性


    在这一点上,穷举搜索并不是禁止的。

    我给出了该字符串作为示例,但我尝试将其打开,以便我可以传入任何字符串,并且程序尝试使用给定字符串形成单词square(前提是字符串的长度和维度sqrt匹配)。因此,我让参数决定单词平方的大小和字符串的长度。它不会改变任何东西。通过从参数字符串中派生字母来获得字母表,通过测量参数字符串的长度并取其平方根来获得单词长度。规则#1拒绝的任何内容也将被删除被规则#3.拒绝。当然,因为字典或词表是有组织的