LeetCode 79.单词搜索 解答

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

回溯类算法,需要明确哪些内容需要保存,已经回溯终止的判断条件,以及剪枝的条件。

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        //搜索起点->深度优先搜索
        int m = board.size();
        if(m == 0)
            return false;
        int n = board[0].size();
        for(int i = 0; i < m; ++i)
        {
            for(int j = 0; j < n; ++j)
            {
                if(dfs(board, word, i, j, 0))
                return true;
            }
        }
        return false;
    }
    
    bool dfs(vector<vector<char>>& board, string& word, int i, int j, int k)
    {
        if(k == word.size())
            return true;
        if(i < 0 || i >= board.size() || j < 0 || j >= board[0].size() || board[i][j] != word[k])
            return false;
        board[i][j] += 259;
        bool res = dfs(board, word, i - 1, j, k + 1) 
            || dfs(board, word, i + 1, j, k + 1) 
            || dfs(board, word, i, j + 1, k + 1)
            || dfs(board, word, i, j - 1, k + 1);
        board[i][j] -= 259;
        return res;
    }
    //需要保存上一个节点的位置,和已经走过的路径
    //结束条件,路径长度等于word长度时
    //若路径与word相等,则返回true,否则返回false
};
发布了48 篇原创文章 · 获赞 29 · 访问量 9791

猜你喜欢

转载自blog.csdn.net/flyconley/article/details/102813087