哈希表
最简单(虽然不是特别有效)的方法是简单递归。
对于每个单元格,递归地环顾四周,跟踪当前单词,并在每一步检查当前单词是否包含在哈希表中。
set up hash table with all words
for each cell c
findWords(c, c.value)
findWords(cell c, string current)
if current.length > longestWord
return
if hashTable.contains(current)
output current
for each neighbour n of c
findWords(n, current + c.value)
现在,为了提高效率,我们基本上可以模拟一个trie。
我们会将每个单词的所有前缀放入哈希表中,因此对于"johnny"
,您将在哈希表中拥有"j"
, "jo"
, "joh"
, "john"
,"johnn"
和"johnny"
。
我们可以只在哈希表中有一个标志来指示给定条目是否是有效单词。因此,对于上述"johnny"
情况,只有这个标志。
set up hash table with all words, but also all prefixes of words
for each cell c
findWords(c, c.value)
findWords(cell c, string current)
if hashTable.contains(current)
if isValidWord(current)
output current
for each neighbour n of c
findWords(n, current + c.value)
特里
对于这个问题, trie似乎是一种更好的数据结构。
首先,用所有的词构建树。然后,对于网格上的每个位置,检查是否存在从根开始的边作为其值。如果有,递归检查它的每个邻居,检查该值是否有边,检查它的邻居,等等。
伪代码是这样的:
set up trie with all words
for each cell c
if root.hasChild(c.value)
findWords(root.getChild(c.value), c)
findWords(node n, cell c)
if n.isValidWord
output n.getWord
for each neighbour ne of c
if n.hasChild(ne.value)
findWords(n.getChild(ne.value), ne)