可以先去看下: Word Search II. 这题的不同之处在于我们要找到一个在矩阵里不重叠的词的集合
题目
给定一个2D矩阵包括 a-z 和字典 dict,找到矩阵上最大的单词集合,这些单词不能在相同的位置重叠。返回最大集合的 大小
可能还有种变体是让求包含最大的单词集合的Path, 这个之后再说
思路
思路1: 暴力的易懂解法
- 先用word search II求出可能的所有单词(允许重叠)
- 去重叠, 用combination的写法求出不重叠的最大集合
复杂度: K: dict里的单词数, L: 单词的平均长度, m,n: board的长宽
第一步: O(K’‘L + m’‘n’‘4^L)
K’‘L是建Trie, mn是外层循环, 4^L是搜索用时, 因为上下左右四种选择, L是搜索树深度
第二步: O(L’*’2^K)
2^K是普通Combination耗时, L是每次递归都要mark路径为blocked
1 |
public class { |
思路2: 高级的双层嵌套搜索
核心思想是:
- 对于每个cell, 求出以这个cell为起点的所有单词
- 将上一步求出的这些单词一个一个试着放进board, 对于每个单词
a. 把这个单词的路径标记为已访问
b..递归求在这个单词已访问的平行世界里的能fit进board的最大集合
网上大神的思路解析: https://jhonwillbao.github.io/2016/11/17/airbnb-boggle-game.html
- 还是用一个 Trie 来加速 Word 的查找
- 第一个循环,遍历 board 上每一个点,然后从这里找第一个单词(因为第一个单词的选择会影响最终单词数量),开始第一个递归。
- 第一个递归的作用是,从当前点开始,通过第二个递归拿到当前点可行的每一个单词。挨个放入,每放入一个更新当前 board 的使用情况,然后开始下一层搜索。
- 第二个递归的作用是,从当前点开始,找所有可行的单词 indexes,为第一个递归提供选择
1 |
import java.util.*; |
po一个别人的思路 (code已过lintcode的AC)
https://www.1point3acres.com/bbs/thread-465509-1-1.html
看到网上的解法都是用好几个search来嵌套,一是不straight forward,二是比较容易出错,不好debug。下面分享下我的解法: m, n是board的长宽,l是word的平均长度,k是board上面找到word的个数。
step1. 找到所有word, 并记录path。 时间复杂度,O(mnl)
step2. 找到每个word的有相交的邻居。 时间复杂度 O(kkl)
step3. 用combination找word的可行的组合,track最长组合的长度。 时间复杂度 O(2^k)
1 |
def boggleGame(self, board, words): |




近期评论