leetcode79. 单词搜索 medium
题目描述:
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.
解题思路:
典型的深度优先遍历 DFS 的应用,原二维数组就像是一个迷宫,可以上下左右四个方向行走,我们以二维数组中每一个数都作为起点和给定字符串做匹配,我们还需要一个和原数组等大小的 visited 数组,是 bool 型的,用来记录当前位置是否已经被访问过,因为题目要求一个 cell 只能被访问一次。如果二维数组 board 的当前字符和目标字符串 word 对应的字符相等,则对其上下左右四个邻字符分别调用 DFS 的递归函数,只要有一个返回 true,那么就表示可以找到对应的字符串,否则就不能找到。
两种实现,第一种我的,第二种参考别人的,都可以把
代码:
class Solution {
public:
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
bool exist(vector<vector<char>>& board, string word) {
if(board.empty() || board[0].empty() || word.empty())
return false;
int row=board.size();
int col=board[0].size();
vector<vector<bool>> visited(row,vector<bool>(col,false));
for(int i=0;i<row;++i){
for(int j=0;j<col;++j){
if(dfs(i,j,0,word,visited,board))
return true;
}
}
return false;
}
bool dfs(int x,int y,int cur,string &word,vector<vector<bool>> &visited,vector<vector<char>>& board){
if(cur==word.size())
return true;
if(x<0 || y<0 || x>=board.size() || y>=board[0].size() || visited[x][y] || board[x][y] != word[cur])
return false;
visited[x][y]=true;
for(int i=0;i<4;i++){
int new_x=x+dx[i];
int new_y=y+dy[i];
if(dfs(new_x,new_y,cur+1,word,visited,board))
return true;
}
visited[x][y]=false;
return false;
}
};
代码二:
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
if (board.empty() || board[0].empty()) return false;
int m = board.size(), n = board[0].size();
vector<vector<bool>> visited(m, vector<bool>(n));
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (search(board, word, 0, i, j, visited)) return true;
}
}
return false;
}
bool search(vector<vector<char>>& board, string word, int idx, int i, int j, vector<vector<bool>>& visited) {
if (idx == word.size()) return true;
int m = board.size(), n = board[0].size();
if (i < 0 || j < 0 || i >= m || j >= n || visited[i][j] || board[i][j] != word[idx]) return false;
visited[i][j] = true;
bool res = search(board, word, idx + 1, i - 1, j, visited)
|| search(board, word, idx + 1, i + 1, j, visited)
|| search(board, word, idx + 1, i, j - 1, visited)
|| search(board, word, idx + 1, i, j + 1, visited);
visited[i][j] = false;
return res;
}
};