【发布时间】:2012-11-10 21:54:34
【问题描述】:
可能重复:
How to find list of possible words from a letter matrix [Boggle Solver]
我有一个String[][] 数组,例如
h,b,c,d
e,e,g,h
i,l,k,l
m,l,o,p
我需要将 ArrayList 与此数组进行匹配,以找到 ArrayList 中指定的单词。在搜索单词hello 时,我需要得到一个正匹配和字母的位置,例如在这种情况下(0,0)、(1,1)、(2,1)、(3,1) 和(3,2)。
当逐个字母地查找时,假设我们成功定位了第一个l 字母,程序应该尝试在它旁边的位置找到下一个字母(l)。所以它应该与 e、e、g、k、o、l、m 和 i 匹配,这意味着它周围的所有字母:水平、垂直和对角线。同一个位置不能在单词中找到两次,所以(0,0)、(1,1)、(2,1)、(2,1) 和(3,2) 是不可接受的,因为位置(2,1) 匹配了两次。在这种情况下,两者都会匹配单词,因为允许对角位置,但它需要匹配另一个 l,因为要求一个位置不能多次使用。
这种情况也应该匹配
h,b,c,d
e,e,g,h
l,l,k,l
m,o,f,p
如果我们假设我们尝试搜索helllo,它将不匹配。 (x1, y1) (x1, y1) 或 (x1, y1) (x2, y2) (x1, y1) 无法匹配。
我想知道实现这种功能的最佳方式是什么。如果我在 ArrayList 中有 4x4 String[][] 数组和 100 000 个单词,那么最有效和最简单的方法是什么?
【问题讨论】:
-
我已经尝试按照我描述的程序应该可以工作:找到第一个字母,匹配它周围的字母并重复该过程。当它周围有多个相同的字母时会出现问题。第二个问题是什么,它可以从任何单元格开始。单词的长度是 3 到 10 个字母(我的语言中最常用的单词)。另外,我想讨论最好的解决方案,而不是如何修复我的缓慢和错误的版本。我认为最好的解决方案是类似的。
-
如果我理解正确,您将无法返回,即在 (0,0) 处读取 h 后,您无法在同一搜索周期中再次读取它。在这种特殊情况下(少量字母,大量单词),我将创建所有可能组合的列表(不仅保存字母,还保存整个路径),例如使用深度优先搜索(因为它不需要大量内存以节省您的中间步骤)。但是响应确实很大程度上取决于问题的条件,如果数组变得比 4x4 大得多,这个解决方案就会有严重的问题。
-
是的,一个坐标只能使用一次,所以(0,0)不能被多次访问。
-
@Serhiy:查看我对 DNA 答案的评论...
标签: java arrays string search boggle