思路:
这道题的话,我们主要是用dfs(当然你也可以用bfs),是道很典型的搜索模板题,这里值得注意的一点就是,我自己写这个dfs的时候,很喜欢用一个book数组来标记哪个节点是否走过,但是其实我们是可以不需要的,在dfs中,我们可以改变这个节点的值来告知这个节点已经遍历过,在回溯的时候恢复成原先的数据即可。
代码:
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
for (int i = 0; i < board.size(); i++) {
for (int j = 0; j < board[0].size(); j++) {
if (dfs(board, word, i, j, 0))
return true;
}
}
return false;
}
private:
bool dfs(vector<vector<char>>& b, string& w, int i, int j, int k) {
if (i >= b.size() || i < 0 || j >= b[0].size() || j < 0 || b[i][j] != w[k])
return false;
if (k == w.length() - 1)
return true;
char temp = b[i][j];
b[i][j] = '/';
int dx[4] = {
-1, 0, 1, 0}, dy[4] = {
0, 1, 0, -1};
for (int q = 0; q < 4; q ++ ) {
int m = i + dx[q], n = j + dy[q];
if (dfs(b, w, m, n, k + 1)){
b[i][j] = temp;
return true;
}
}
b[i][j] = temp;
return false;
}
};