思路:
This problem can be solved by using a typical DFS method.
时间 O(N^2) 空间 O(N)
我们知道一次搜索的复杂度是O(E+V),E是边的数量,V是顶点数量,在这个问题中他们都是O(m*n)量级的(因为一个顶点有固定上下左右四条边)。加上我们对每个顶点都要做一次搜索,所以总的时间复杂度最坏是O(m^2*n^2),空间上就是要用一个数组来记录访问情况,所以是O(m*n)。
Time复杂度: 遍历整个m * n 的board的时间复杂度为m * n,对于每个点都会往上下左右来遍历寻找, k为word长度,大概要遍历4^k次,所以总的时间复杂度大概在mn4^k.
Space: 由于word长度为k,recursive space大概在O(k).
“以board上的每个cell为出发点,利用depth first search向上下左右四个方向搜索匹配word。搜索的时候要考虑board的边界,cell是否已经在DFS的路径上被用过,以及cell上的值是否与word的当前字符匹配。为了跟踪DFS的路径避免同一个cell被访问多次,使用一个visited矩阵来代表board上任意的cell(i, j)是否已经被访问过。”
用图, DFS递归.搜索的时候要注意边界。把访问过并且在word里面的点,存进一个visited数组中,防止重复使用字母。index为了防止word中的字母多次访问。
最后visited要设为false,如果if的结果都是true的话,visited是什么都无妨,但如果是false的话,说明这个数没有用到,所以要设为false。
第一步for循环外要return false 因为如果访问到最外层一定是因为for里面没有返回true,所以一定是false的。
递归的时候要注意递归的出口,结束当前一层递归之后要返回上一层递归。