主要采用深度优先搜索
exist函数主要功能就是将每个board中的点送入dfs函数进行遍历
dfs为深度优先搜索,分别遍历该点上下左右四个点,若符合则对该点进行dfs递归
当
- 点的坐标超出范围
- 计数值cnt超过word字符串下标范围
- 已经成功找到即find为true
- 该点已经在已找到的符合标准的字串中,即flag[i][j]为true
- 该点的值不等于要匹配的word字段里相应的字符
时,结束dfs继续递归,返回没找到,即find为false
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
if(board.empty())return false;
int row = board.size(),column = board[0].size();
vector<vector<bool>> flag(row,vector<bool>(column,false));//记录节点是否访问
bool find = false;
for(int i = 0;i < row;i++)
for(int j = 0;j < column;j++)
dfs(i,j,board,word,flag,0,find);
return find;
}
void dfs(int i,int j,vector<vector<char>>& board,string& word,vector<vector<bool>> &flag,int cnt,bool& find)
{
if(cnt >= word.size() || find || i < 0 || j < 0 || i >= board.size() || j >= board[0].size()|| flag[i][j] || board[i][j] != word[cnt])return ;
if(cnt == word.size() - 1)
{
find = true;
return ;
}
cnt++;
flag[i][j] = true;//标记已经访问过了
dfs(i + 1,j,board,word,flag,cnt,find);
dfs(i - 1,j,board,word,flag,cnt,find);
dfs(i,j + 1,board,word,flag,cnt,find);
dfs(i,j - 1,board,word,flag,cnt,find);
flag[i][j] = false;
}
};
一定要注意参数是引用还是值传递,能用引用一定要用引用,如图word用值传递会在递归栈中存储大量的副本导致内存消耗大大增大,复制word副本的时间将导致运行时间大大增大。
board数组比word字符串更大,采用值传递直接超出规定时间