如何在字母矩阵中找到单词

时间:2010-11-30 12:53:23

标签: algorithm language-agnostic

这是我在电话采访中被问到的另一个问题:

给定字典和填字游戏(2d字符矩阵),找到可以在填字游戏中找到的所有字典单词。

我能想到的只是对字典进行哈希,找到填字游戏中的每个可能的单词并搜索哈希。我无法优化它。

必须承认微软的面试问题很难:(

请给我一些思考的方法。

6 个答案:

答案 0 :(得分:5)

怎么样:

  • 为字典构建搜索树(每个字母一个级别)
  • 对于网格中的每个位置,开始搜索索引,一次一个字符,然后继续进行每个允许的方向,直到索引中没有条目,或者你遇到网格边界

我认为哈希在这里不是一个非常有用的优化。

答案 1 :(得分:4)

最合适的解决方案很大程度上取决于您期望处理的约束。你的字典有多大?你的填字游戏有多大。

我建议你看看Suffix trees。您可以将所有字典单词插入一个。然后在后缀树中搜索行,列和对角线。对于行,从树的根开始搜索每行中的第一个字母,并在通过该行时遍历树。如有必要,从右到左执行相同操作。列和对角线的类似故事。

树构造是O(N)并且消耗O(N)空间,其中N是字典的字典大小。然后搜索将花费O(PQ)时间,其中填字游戏的大小为PxQ。给出O(N + PQ)的整体运行时间和O(N)的空间。

但事实上,后缀树很难实现。他们真的是。因此,您可能更愿意选择简单的Trie,这将为您提供总运行时间O(N + PQ(max(P,Q))。

答案 2 :(得分:4)

这个问题正是人们如何玩 Boggle

过去的这个问题已经足够ANSWERS THIS QUESTION了。

玩得开心......

答案 3 :(得分:2)

假设字典包含 n 平均长度 k 的单词,矩阵包含 m ²字符。

  1. 将字典预处理为prefix tree(也称为trie)。 - O( kn
  2. 对于矩阵中的每个位置,在trie中向上和向下查找字符串。 - O( m ³)
  3. 总时间:O(最大值( kn m ³))

    在实际的单词搜索中,矩阵中找到的单词的平均长度更像是 k 而不是 m ,因此所用的时间将为O( k max( n m ²))。

答案 4 :(得分:2)

你的回答出了什么问题?

  • 字典已排序,所以我想我会将字典单词排列成prefix trie。这将有所帮助,因为可能有很多单词,前缀也是一个单词。排序有助于(最低限度地)构建时间。

  • 然后走看填字游戏,查看所有可能的单词。当你提取一个潜在单词的字符时,你正沿着特里走 - 所以你会发现第一个单词以一组特定的字符开头,但也可以在正确的位置继续查找以相同字符开头的其他单词字符

答案 5 :(得分:0)

我会将字典编译成识别字典中单词的DFA,然后在字母矩阵的行和列以及对角线上运行它。应为O(m+n),其中m是字典中字符的长度,n是矩阵的区域(w * h)。