79. 单词搜索

176 阅读1分钟

题目描述

给定一个 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;
}