2021/3/27,题意如下:
其实也没啥好说的,深搜+剪枝就行了,不过代码中还是有很多细节要注意的。
c++参考代码:
class Solution {
public:
int n,m;
int f[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
bool dfs(vector<vector<char>> board, string word,int i,int j,int k)
{
if(k==word.size())
return true;
char c=board[i][j];
board[i][j]='\0';//剪枝
for(int a=0;a<4;++a)
{
int nexti=i+f[a][0];
int nextj=j+f[a][1];
if(nexti>=n||nextj>=m||nexti<0||nextj<0)
continue;
if(board[nexti][nextj]==word[k])
{
if(dfs(board,word,nexti,nextj,k+1))
return true;
}
}
board[i][j]=c;//恢复
return false;
}
bool exist(vector<vector<char>>& board, string word) {
n=board.size();
if(word.size()==0)
return true;
if(!n)
return false;
m=board[0].size();
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(board[i][j]==word[0])
{
if(dfs(board,word,i,j,1))
return true;
}
}
}
return false;
}
};
时间复杂度 O(3KMN): 最差情况下,需要遍历矩阵中长度为 K 字符串的所有方案,时间复杂度为 O(3K),矩阵中共有 MN个起点,时间复杂度为 O(MN) 。方案数计算: 设字符串长度为 K ,搜索中每个字符有上、下、左、右四个方向可以选择,舍弃回头(上个字符)的方向,剩下 3 种选择,因此方案数的复杂度为 O(3K)。
空间复杂度 O(K) : 搜索过程中的递归深度不超过 K ,因此系统因函数调用累计使用的栈空间占用 O(K)。
参考资料
·Krahets《面试题12. 矩阵中的路径( DFS + 剪枝 ,清晰图解)》