单词搜索

solve actually problem!

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

代码实现如下:

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        if (board.empty() || board[0].empty()) {
            return false;
        }

        int r = board.size();
        int c = board[0].size();
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                if (dfs(board, i, j, word, 0)) {
                    return true;
                }
            }
        }
        return false;
    }

    vector<int> dir{-1, 0, 1, 0, -1};
    bool dfs(vector<vector<char>> &board, int x, int y, string &word, int u)
    {
        if (board[x][y] != word[u]) {
            return false;
        }

        if (u == word.size() - 1) {
            return true;
        }

        int n = board.size();
        int m = board[0].size();
        board[x][y] = '.';
        for (int i = 0; i < 4; i++) {
            auto x_ = x + dir[i];
            auto y_ = y + dir[i + 1];
            if (x_ < 0 || x_ >= n || y_ < 0 ||  y_ >= m) {
                continue;
            }

            if (dfs(board, x_, y_, word, u + 1)) {
                return true;
            }
        }

        board[x][y] = word[u];
        return false;
    }
};