题目链接:79. 单词搜索 题解 - 力扣(LeetCode)
题目类型:DFS,回溯
代码:400+ms......................
题目时间复杂度为O(m*n*3^k),其中k为单词长度(即最坏情况,每个起点都走3个方向,每个方向都最终走k格???
class Solution {
public:
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
int m,n;
bool exist(vector<vector<char>>& board, string word) {
m=board.size();
n=board[0].size();
if(board.empty()||board[0].empty()) return false;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
if(dfs(board,i,j,word,0))
return true;
}
return false;
}
//函数参数用引用的话能直接得到数组的地址
bool dfs(vector<vector<char>>& board,int i,int j,string word,int u)
{
if(board[i][j]!=word[u]) return false;
if(u==word.size()-1) return true;
int x,y;
board[i][j]='.';//将用过的字母改成符号避免重用
for(int k=0;k<4;k++)
{
x=i+dx[k];
y=j+dy[k];
if(x>=0&&x<=m-1&&y>=0&&y<=n-1)
if(dfs(board,x,y,word,u+1))
return true;
}
board[i][j]=word[u];//回溯时机:该节点全部走完再回溯
return false;
}
};
收获:
回溯时机想不出来时,先想想搜索树,当一个节点的子节点全部走完时回溯