Given a 2D board and a word, find if the word exists in the grid.
The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.
Example:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
Given word = "ABCCED", return true.
Given word = "SEE", return true.
Given word = "ABCB", return false.
解题思路:
递归法:用cur记录当前遍历word位置,当最终cur == word的长度,说明含有此单词,对每个(i,j)位置,若与word的cur处的字母不一致或者该位置已经遍历过(用visit数组标记),则返回错误。若一致,则遍历(i,j)的周围的字母与word的cur+1处的字符。
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
if((board.size() == 0 || board[0].size() == 0) && word.length() > 0)
return false;
else if(word.length() == 0)
return true;
m = board.size(); n = board[0].size();
vector<vector<bool>>visit(m, vector<bool>(n, false));
for(int i = 0; i < m; ++ i)
for(int j = 0; j < n; ++ j){
if(dfs(board, visit, i, j, word, 0))
return true;
}
return false;
}
private:
int m, n;
bool dfs(vector<vector<char>>& board, vector<vector<bool>>& visit, int row, int col, string word, int cur){
if(cur == word.length())
return true;
if(row < 0 || row == m || col < 0 || col == n)
return false;
if(visit[row][col] == true || board[row][col] != word[cur])
return false;
visit[row][col] = true;
bool flag = dfs(board, visit, row+1, col, word, cur+1) || dfs(board, visit, row-1, col, word, cur+1) || dfs(board, visit, row, col+1, word, cur+1) || dfs(board, visit, row, col-1, word, cur+1);
visit[row][col] = false;
return flag;
}
};