题目描述
给定一个 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
来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/wo…
实现
bool backtracking(char **board, int boardSize, int *boardColSize, char *word, int i, int j, int sum)
{
int flag[4][2] = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
// 中止条件
if (board[i][j] != word[sum]) {
return false; // 不相等,回溯
}
if (sum == strlen(word) - 1) { // 已经全部找到
return true;
}
// 已经访问过的用#替换,表示已经访问
char tmp = board[i][j];
board[i][j] = '#';
// 从4个方向遍历
for (int idx = 0; idx < 4; idx++) {
int x = i + flag[idx][0];
int y = j + flag[idx][1];
if (x < 0 || x > boardSize - 1 || y < 0 || y >= boardColSize[0] || board[x][y] == '#') {
continue;
}
if (backtracking(board, boardSize, boardColSize, word, x, y, sum + 1)) {
return true;
}
}
board[i][j] = tmp;
return false;
}
bool exist(char **board, int boardSize, int *boardColSize, char *word)
{
// 从每一个字符位置开始搜索
for (int i = 0; i < boardSize; i++) {
for (int j = 0; j < boardColSize[0]; j++) {
if (backtracking(board, boardSize, boardColSize, word, i, j, 0)) { // 0 表示当前搜索到的个数
return true;
}
}
}
return false;
}