79. 单词搜索

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

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

示例:

board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]

给定 word = "ABCCED", 返回 true
给定 word = "SEE", 返回 true
给定 word = "ABCB", 返回 false

提示:

board 和 word 中只包含大写和小写英文字母。
1 <= board.length <= 200
1 <= board[i].length <= 200
1 <= word.length <= 10^3

思路

递归改非递归是真的难。。。

#define PII pair<int, int>

class Solution {
public:
    
    bool dfs(vector<vector<char>> &board, string &word){
        int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
        bool st[210][210];
        vector<PII> stk;
        vector<int> idx;

        int m = board.size(), n = board[0].size();

        for(int i = 0; i < m; i ++)
            for(int j = 0; j < n; j ++){
                if(board[i][j] == word[0]){
                    
                    memset(st, 0, sizeof st);
                    
                    stk.clear(), idx.clear();
                    stk.push_back({i, j});
                    
                    st[i][j] = 1;
                    
                    int s = 0;

                    while(stk.size()){
                        if(stk.size() == word.size()) return 1;
                        auto t = stk.back();
                        int x = t.first, y = t.second;

                        int flag = 0;
                        for(int i = s; i < 4; i ++){
                            int a = x + dx[i], b = y + dy[i];
                            if(a < 0 || a >= m || b < 0 || b >= n) continue;
                            if(st[a][b] || board[a][b] != word[stk.size()]) continue;
                            
                            s = 0;
                            flag = 1;
                            st[a][b] = 1;
                            idx.push_back(i + 1);
                            stk.push_back({a, b});
                            
                            break;
                        }
                        
                        if(!flag){
                            st[x][y] = 0;
                            stk.pop_back();
                            if(idx.size()){
                                s = idx.back();
                                idx.pop_back();
                            } 
                        }
                    }
                }
            }
            return 0;
    }

    bool exist(vector<vector<char>>& board, string word) {

        return dfs(board, word);
    }
};
原文地址:https://www.cnblogs.com/tomori/p/13457743.html