这是我在电话采访中被问到的另一个问题:
给定字典和填字游戏(2d字符矩阵),找到可以在填字游戏中找到的所有字典单词。
我能想到的只是对字典进行哈希,找到填字游戏中的每个可能的单词并搜索哈希。我无法优化它。
必须承认微软的面试问题很难:(
请给我一些思考的方法。
答案 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)
答案 3 :(得分:2)
假设字典包含 n 平均长度 k 的单词,矩阵包含 m ²字符。
总时间:O(最大值( kn , m ³))
在实际的单词搜索中,矩阵中找到的单词的平均长度更像是 k 而不是 m ,因此所用的时间将为O( k max( n , m ²))。
答案 4 :(得分:2)
你的回答出了什么问题?
字典已排序,所以我想我会将字典单词排列成prefix trie。这将有所帮助,因为可能有很多单词,前缀也是一个单词。排序有助于(最低限度地)构建时间。
然后走看填字游戏,查看所有可能的单词。当你提取一个潜在单词的字符时,你正沿着特里走 - 所以你会发现第一个单词以一组特定的字符开头,但也可以在正确的位置继续查找以相同字符开头的其他单词字符
答案 5 :(得分:0)
我会将字典编译成识别字典中单词的DFA,然后在字母矩阵的行和列以及对角线上运行它。应为O(m+n)
,其中m
是字典中字符的长度,n
是矩阵的区域(w * h)。