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

时间:2016-04-07 23:19:29

标签: java

我有一个乱码如下:“artearardreardac”。

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

C A R D
A R E A
R E A R
D A R T

我的意图是最初循环遍历加扰的String并在每次尝试匹配4个字符时查询该文本文件以查看它是否是有效字。

问题在于每个循环检查300,000个单词。需要多长时间。我只通过第一个字母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;
}

2 个答案:

答案 0 :(得分:0)

由于您似乎想要从作为函数参数的字母中创建一个单词square,您知道正方形中的绝对字长是sqrt(amountOfLetters)。在你的examplecode中,sqrt(16)= 4.你也可以直接从你的字典中取消很多单词:

  1. 如果单词不以“字母”中的字母开头(即“A”,“C”,“D”,“E”,“R”,“T”),则丢弃该单词
  2. 如果一个单词不等于你的字长(即4)
  3. ,则丢弃一个单词
  4. 如果字母不在您的字母表中,则丢弃该字词
  5. 你想在广场上“写”的字数是字长* 2(因为这些字只能从上一行或从左列开始)

    然后将您的方块与这个新的较短的字典进行比较。

    通过建立广场,我认为有两种可能性可供选择。

    1. 第一个是从字母中随机组织正方形,并检查字母是否形成正确的单词

    2. 第二个是从字典中随机选择“正确”的单词,然后将它们写入你的正方形。之后,检查单词是否使用正确的金额和字母设置

答案 1 :(得分:0)

如果您正确整理字典,可以大大减少搜索空间。 (可以在阅读时完成,您不需要修改磁盘上的文件。)

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

现在,为了减少搜索空间 - 请注意,单例只能出现在从左上角到右下角的对角线上。你有一个奇数的C,T,R和A - 这4个字母构成了这个对角线。 (请注意,您不能总是这样做,因为它们不能保证唯一。)您的搜索空间现在是一组4个包含4个选项(24个选项)和一个6个选项(720个选项除外)重复这一切减少了。)17k可能的板和1k以下的单词(编辑:我原来说5k但你可以将空格限制为以正确的字母开头的单词,因为它是一个你不需要的排序列表考虑其他人)尝试,你已经有超过2000万的可能性来检查。您可以通过先将单词列表过滤到仅包含所用字母的单词列表来大幅减少这一点。

此时,详尽的搜索并不会让人望而却步。