LeetCode/单词搜索

给定一个m x n二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用

1. 回溯法

类似于岛屿搜索的二维矩阵搜索,要用一个二维数组标记遍历过的路径,然后就是遍历每一个位置,递归四个方向
递归的时候注意矩阵边界以及该位置是否探索过

class Solution {
public:
    bool flag = false;
    void check(vector<vector<char>>& board, vector<vector<int>>& visited, int i, int j, string& s, int k) {
        if(flag) return;
        if (board[i][j] != s[k]) return;//判断对应值相等
        if (k == s.length() - 1){flag=1;return;}//到达边界
        visited[i][j] = true; //记录足迹
        vector<pair<int, int>> directions{{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
        //做选择
        for (const auto& dir: directions) {
            int newi = i + dir.first, newj = j + dir.second;//递归四个方向
            //越界条件
            if (newi >= 0 && newi < board.size() && newj >= 0 && newj < board[0].size()) 
                if (!visited[newi][newj]) //如果不在路径中
                    check(board, visited, newi, newj, s, k + 1);//递归下一位置
        }
        visited[i][j] = false;//撤销该位置选择
    }

    bool exist(vector<vector<char>>& board, string word) {
        int h = board.size(), w = board[0].size();
        vector<vector<int>> visited(h, vector<int>(w));//建立一个足迹表
        //递归每一个位置
        for (int i = 0; i < h; i++) 
            for (int j = 0; j < w; j++) {
                if (flag) return true;//找到立马结束遍历
                check(board, visited, i, j, word, 0);
            }
        return flag;
    }
};
posted @ 2022-05-25 00:27  失控D大白兔  阅读(24)  评论(0编辑  收藏  举报