此题本质是一个DFS,我们试图逐行递归填充单词。假设我们已经合法地填充了前i-1行的单词,那么第i行单词s的选择其实有个约束:s的前i-1个字母必须和方块中第i列的前i-1个字母完全相同。例如:
a b c d e
b c f g h
c f x x x
d g x
e h x
我们已经填充了前两行(即前两列),在填充第三行的时候,发现要求前两个字母的前缀必须固定为cf,故可选择填充的单词范围就很小了。
那么如何高效地列出符合前缀条件的单词,而不用尝试所有的300个单词呢?我们提前建立hash表,将所有单词的所有前缀(最长不超过4)作为key,映射到对应的单词。如上面的例子,我们只需要在hash["cf"]所对应的单词里面寻找一个就可以填充进第三行。如果不存在的话,那么就提前返回。
当dfs深入到所有的行都填充完毕,此时的盘面就是一个答案。