【leetcode】79. 单词搜索(word-search)(回溯)[中等]

2023-05-16

链接

https://leetcode-cn.com/problems/word-search/

耗时

解题:50 min
题解:6 min

题意

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

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

思路

遍历二维网格,找 网格中字母 与 单词第一个字母相同 的位置,从这样的位置开始 dfs 找单词中剩下的字母,看能否通过 上下左右 寻找到全部。

时间复杂度: O ( n ∗ m ∗ 3 w o r d . s i z e ( ) ) O(n*m*3^{word.size()}) O(nm3word.size())

AC代码

class Solution {
private:
    vector<vector<char>> board;
    string word;
    bool ans = false;
    int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
    int n, m;
    bool vis[300][300];
public:
    void dfs(int x, int y, int pos) {
        if(pos == word.size()) {
            ans = true;
            return ;
        }
        vis[x][y] = true;
        for(int i = 0; i < 4; ++i) {
            int nx = x + dir[i][0];
            int ny = y + dir[i][1];
            if((nx >= 0 && nx < n) && (ny >= 0 && ny < m)) {
                if(vis[nx][ny]) continue;
                if(board[nx][ny] == word[pos]) {
                    dfs(nx, ny, pos+1);
                    if(ans) return ;
                }
            }
        }
        vis[x][y] = false;
    }
    
    bool exist(vector<vector<char>>& board, string word) {
        this->board = board;
        this->word = word;
        n = board.size();
        m = board[0].size();
        for(int i = 0; i < n; ++i) {
            for(int j = 0; j < m; ++j) {
                if(board[i][j] == word[0]) {
                    dfs(i, j, 1);
                    if(ans) return true;
                }
            }
        }
        return false;
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【leetcode】79. 单词搜索(word-search)(回溯)[中等] 的相关文章

随机推荐