知识点

DFS 搜索

思路

在board中搜索,每个位置能否和字符串的对应位置匹配,如果能找到则返回true

实现上,可以先存下本个位置的board字符,和字符串匹配使用完后置为‘#’,防止该位置被循环使用,退出本层时还原board的字符。

AC code(C++)

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param board char字符型vector<vector<>> 
     * @param word string字符串 
     * @return bool布尔型
     */
    int dx[4] = {-1, 0, 1, 0};
    int dy[4] = {0, -1, 0, 1};
    bool exist(vector<vector<char> >& board, string word) {
        int n = board.size(), m = board[0].size();
        
        function<bool(int, int, int)> dfs = [&](int x, int y, int u) {
            if (u == word.size()) {
                return true;
            }
            auto t = board[x][y];
            if (t != word[u]) return false;
            board[x][y] = '#';
            for (int i = 0; i < 4; i ++) {
                int nx = x + dx[i], ny = y + dy[i];
                if (nx >= 0 and ny >= 0 and nx < n and ny < m) {
                    if (dfs(nx, ny, u + 1)) return true;
                }
            }
            board[x][y] = t;
            return false;
        };

        for (int i = 0; i < n; i ++) {
            for (int j = 0; j < m; j ++) {
                if (dfs(i, j, 0)) return true;
            }
        }
        return false;
    }
};