给定一个 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
题目分析:
通过字符二维数组,从左上到右下,找到第一个word字母出现的位置
DFS状态的设置:
状态记录:int **flag 申请一个二维数组,记录是否进过这些坐标
返回条件:当找到匹配的全部word字母时,返回True
执行条件:将flag对应的row,col位置值1,表示已经走过该坐标
遍历条件:按照当前位置的上下左右4个方向进行遍历,flag的的值为0,且下一个字母与word匹配,
作者:我自横刀向天笑
链接:https://leetcode.cn/problems/word-search/solutions/1312399/dan-ci-sou-suo-cyu-yan-xiang-jie-chao-ji-rvqm/
bool dfs(char **board, int maxRow, int maxCol, char *word, int top, int row, int col, int **flag)
{
if (top >= strlen(word)) {
return true;
}
if (row != 0 && flag[row - 1][col] == 0 && board[row - 1][col] == word[top]) {
flag[row - 1][col] = 1;
if (dfs(board, maxRow, maxCol, word, top + 1, row - 1, col, flag)) {
return true;
}
}
if (row != maxRow - 1 && flag[row + 1][col] == 0 && board[row + 1][col] == word[top]) {
flag[row + 1][col] = 1;
if (dfs(board, maxRow, maxCol, word, top + 1, row + 1, col, flag)) {
return true;
}
}
if (col != 0 && flag[row][col - 1] == 0 && board[row][col - 1] == word[top]) {
flag[row][col - 1] = 1;
if (dfs(board, maxRow, maxCol, word, top + 1, row, col - 1, flag)) {
return true;
}
}
if (col != maxCol - 1 && flag[row][col + 1] == 0 && board[row][col + 1] == word[top]) {
flag[row][col + 1] = 1;
if (dfs(board, maxRow, maxCol, word, top + 1, row, col + 1, flag)) {
return true;
}
}
flag[row][col] = 0;
return false;
}
bool exist(char** board, int boardSize, int* boardColSize, char * word)
{
int row;
int col;
int maxRow = boardSize;
int maxCol = boardColSize[0];
int **flag = malloc(sizeof(int *)*maxRow);
for (row = 0; row < boardSize; row++) {
flag[row] = malloc(sizeof(int) * maxCol);
memset(flag[row], 0, sizeof(int) * maxCol);
}
for (row = 0; row <maxRow; row++) {
for (col = 0; col < maxCol; col++) {
if (board[row][col] == word[0]) {
flag[row][col] = 1;
if (dfs(board, maxRow, maxCol, word, 1, row, col, flag)) {
return true;
}
}
}
}
return false;
}