给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
回溯类算法,需要明确哪些内容需要保存,已经回溯终止的判断条件,以及剪枝的条件。
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
//搜索起点->深度优先搜索
int m = board.size();
if(m == 0)
return false;
int n = board[0].size();
for(int i = 0; i < m; ++i)
{
for(int j = 0; j < n; ++j)
{
if(dfs(board, word, i, j, 0))
return true;
}
}
return false;
}
bool dfs(vector<vector<char>>& board, string& word, int i, int j, int k)
{
if(k == word.size())
return true;
if(i < 0 || i >= board.size() || j < 0 || j >= board[0].size() || board[i][j] != word[k])
return false;
board[i][j] += 259;
bool res = dfs(board, word, i - 1, j, k + 1)
|| dfs(board, word, i + 1, j, k + 1)
|| dfs(board, word, i, j + 1, k + 1)
|| dfs(board, word, i, j - 1, k + 1);
board[i][j] -= 259;
return res;
}
//需要保存上一个节点的位置,和已经走过的路径
//结束条件,路径长度等于word长度时
//若路径与word相等,则返回true,否则返回false
};