Java Word搜索解算器设计方法

时间:2010-09-30 06:00:04

标签: java algorithm

我正在编写一个单词搜索解算器的程序,如果有比我正在采用的方法更好的方法,我很好奇。该程序包含一个字符网格,这些字符被认为是拼图,后面是换行符,字符位于矩阵中。

我的问题是,在定位每个字符串的开头和结尾字符时,最好是通过拼图为每个方向设置嵌套循环,或者使用某种直线检测算法简化此过程?

单词可以是水平,垂直或对角线,反之亦然。

我真正要做的是在2d char数组(Puzzle)中绘制char数组(The Word)的起点和终点

拼图的例子
HGAMONIHRA
AOMOKAWONS
NFROLBOBDN
ARFSIHCAGE
LNIEEWONOK
GOLFUNDTHC
KOCATAOHBI
AMRERCGANH
SLGFAMALLC
ALLIGATORX

HORSE
COW
RHINO
JABBERWOCKY
CAT
DOG
鳄鱼

FROG
班萨

LLAMA

假设我只使用一系列循环,我不确定最好的方法来检查所有方向。到目前为止,我只是让它在水平搜索单词

                boolean over = false;
                boolean foundit = false;
                String word = new String(letters);

                for (int i = 0; (i < puzzle.length) && (!over); i++) {
                    for (int j = 0; (j < puzzle[i].length) && (!over); j++) {

                        // Use (i,j) as the starting point.
                        foundit = true;

                        // Look through each letter in word
                        for (int k = 0; (k < letters.length) && (foundit); k++) {
                            if ((j + k >= puzzle[i].length)
                                    || (letters[k] != puzzle[i][j + k])) {
                                // It didn't Match
                                foundit = false;
                            }
                        }
                        // Success if we made it through all the characters
                        if (foundit) {
                            System.out.println(word + " found in row=" + i
                                    + " col=" + j);
                            over = true;
                        }

                    }
                }

                if (!foundit) {
                    System.out.println(word + " not found");
                }

任何指针在垂直,对角和反向找到它们?

1 个答案:

答案 0 :(得分:1)

做它暴力不会太可怕。您可以使用更快的算法,但初始开销可能超过好处,因此请务必为典型示例进行基准测试。

您可以尝试将整个拼图放在multi_hashmap中,其中字母是键,位置是值。这将使搜索更快(O(1)用于查找而不是O(n)来查找第一个字母),但是您可能没有获得太多收益,因为您必须遍历整个谜题以将其放入hashmap中。 / p>

蛮力非常接近O(n * m),其中n是拼图大小,m是隐藏单词的数量。 (我假设一个受约束的字长,比如20。)

使用hashmap并不是那么多。这是关于O(n + m),但对于较小的谜题来说,时间差异并不大。不过,这绝对是渐进式的。做两者并比较他们的时间。这是了解最佳方式。