79. 单词搜索
难度中等1103
给定一个 m x n
二维字符网格 board
和一个字符串单词 word
。如果 word
存在于网格中,返回 true
;否则,返回 false
。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例 1:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
示例 2:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
输出:true
示例 3:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB"
输出:false
提示:
m == board.length
n = board[i].length
1 <= m, n <= 6
1 <= word.length <= 15
board
和word
仅由大小写英文字母组成
**进阶:**你可以使用搜索剪枝的技术来优化解决方案,使其在 board
更大的情况下可以更快解决问题?
1.c++
/*
* 2021-12-04 18:50
* Hangzhou
*/
#include <vector>
#include <string>
using namespace std;
class Solution {
public:
bool DFS(int x, int y,int m,int n,vector<vector<bool>>& map_visited,vector<vector<char>>& board,int& cur,string& word)
{
if (word.length() == cur)
{
return true;
}
//up
if (x-1 >= 0 && map_visited[x-1][y] == false && board[x-1][y] == word[cur])
{
map_visited[x-1][y] = true;
cur++;
if (true == DFS(x-1,y,m,n,map_visited,board,cur,word))
{
return true;
}
map_visited[x-1][y] = false;
cur--;
}
//down
if (x+1 <= m-1 && map_visited[x+1][y] == false && board[x+1][y] == word[cur])
{
map_visited[x+1][y] = true;
cur++;
if (true == DFS(x+1,y,m,n,map_visited,board,cur,word))
{
return true;
}
map_visited[x+1][y] = false;
cur--;
}
//left
if (y-1 >= 0 && map_visited[x][y-1] == false && board[x][y-1] == word[cur])
{
map_visited[x][y-1] = true;
cur++;
if (true == DFS(x,y-1,m,n,map_visited,board,cur,word))
{
return true;
}
map_visited[x][y-1] = false;
cur--;
}
//right
if (y+1 <= n-1 && map_visited[x][y+1] == false && board[x][y+1] == word[cur])
{
map_visited[x][y+1] = true;
cur++;
if (true == DFS(x,y+1,m,n,map_visited,board,cur,word))
{
return true;
}
map_visited[x][y+1] = false;
cur--;
}
return false;
}
bool exist(std::vector<std::vector<char>>& board, std::string word) {
int m = board.size();
if (m <= 0)
{
return false;
}
int n = board[0].size();
std::vector<bool> row(n,0);
std::vector<std::vector<bool>> map_visited(m,row);
for (int i = 0; i < board.size();++i)
{
for (int j = 0; j < board[0].size();++j)
{
if (board[i][j] == word[0])
{
int cur = 1;
map_visited[i][j] = true;
if ( true == DFS(i,j,m,n,map_visited,board,cur,word))
{
return true;
}
map_visited[i][j] = false;
}
}
}
return false;
}
};
int main()
{
Solution slu;
vector<vector<char> > board{ {'A','B','C','E'},
{'S','F','C','S'},
{'A','D','E','E'} };
string word = "ABCCED";
const char* ret = (slu.exist(board,word) == true?"true":"false");
printf("%s\n",ret);
return 0;
}