(更新)
我们需要找出可以从字符矩阵中形成给定字符串的方法的数量。
我们可以从矩阵中的任何位置(i, j) 开始形成单词,并且可以从矩阵的每个单元格(i, j) 可用的 8 个方向中的任何未访问方向前进,即
(i + 1, j)
(i + 1, j + 1)
(i + 1, j - 1)
(i - 1, j)
(i - 1, j + 1)
(i - 1, j - 1)
(i, j + 1)
(i, j - 1)
示例测试用例:
(1) input:
N = 3 (length of string)
string = "fit"
matrix: fitptoke
orliguek
ifefunef
tforitis
output: 7
(2) input:
N = 5 (length of string)
string = "pifit"
matrix: qiq
tpf
pip
rpr
output: 5
解释:
使“适合”的方法数量如下所示:
(0,0)(0,1)(0,2)
(2,1)(2,0)(3,0)
(2,3)(1,3)(0,4)
(3,1)(2,0)(3,0)
(2,3)(3,4)(3,5)
(2,7)(3,6)(3,5)
(2,3)(1,3)(0,2)
我以一种天真的方式接近解决方案,转到矩阵中的每个可能位置 (i,j),并通过对矩阵执行 DFS 搜索从该单元格 (i,j) 开始形成字符串,并添加形成方法的数量从 pos (i, j) 到 total_num_ways 变量的给定字符串。
伪代码:
W = 0
for i : 0 - n:
for j: 0 - m:
visited[n][m] = {false}
W += DFS(i, j, 0, str, matrix, visited);
但事实证明,这个解决方案的时间复杂度是指数级的,因为我们要去每一个可能的 n * m 位置,然后遍历每一个可能的 k(字符串长度)长度路径来形成字符串。
我们如何提高解决方案的效率?