给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
[‘A’,‘B’,‘C’,‘E’],
[‘S’,‘F’,‘C’,‘S’],
[‘A’,‘D’,‘E’,‘E’]
]
给定 word = “ABCCED”, 返回 true
给定 word = “SEE”, 返回 true
给定 word = “ABCB”, 返回 false
提示:
board 和 word 中只包含大写和小写英文字母。
1 <= board.length <= 200
1 <= board[i].length <= 200
1 <= word.length <= 10^3
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-search
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
回溯法,尽量提前截止dfs,且限制进入dfs的条件
class Solution {
public:
//直接DFS就可以了吧
bool exist(vector<vector<char>>& board, string word) {
if(word.size() == 0)return true;
vector<vector<bool>> visited(board.size(),vector<bool>(board[0].size(),false));
for(int i=0;i<board.size();i++){
for(int j=0;j<board[0].size();j++){
if(board[i][j] == word[0]){
//可以从当前位置开始dfs
if(dfs(board,visited,word,0,i,j))
return true;
}
}
}
return false;
}
bool dfs(vector<vector<char>>& board,vector<vector<bool>>& visited,string& word,int index,int i,int j){
if(index == word.size()-1)
return board[i][j] == word[index];
visited[i][j] = true;
//cout<<i<<" "<<j<<endl;
//相邻方向
bool up,down,left,right;
up = down = left = right = false;
if(i >= 1 && !visited[i-1][j] && board[i-1][j] == word[index+1])
up = dfs(board,visited,word,index+1,i-1,j);
if(up) return true;
if(j >= 1 && !visited[i][j-1] && board[i][j-1] == word[index+1])
left = dfs(board,visited,word,index+1,i,j-1);
if(left) return left;
if(i < board.size()-1 && !visited[i+1][j] && board[i+1][j] == word[index+1])
down = dfs(board,visited,word,index+1,i+1,j);
if(down)return down;
if(j < board[0].size()-1 && !visited[i][j+1] && board[i][j+1] == word[index+1])
right = dfs(board,visited,word,index+1,i,j+1);
if(right)return true;
visited[i][j] = false;
//cout<<up<<" "<<down<<" "<<left<<" "<<right<<endl;;
return false;
}
};