zoukankan      html  css  js  c++  java
  • 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);
        }
    };
    
  • 相关阅读:
    [C#性能简析]泛型集合的使用
    理解自定义特性(Attribute)
    C语言第1次作业2.0版
    C语言第3次作业
    C语言第1次作业
    C语言第2次作业
    kubernetes 部署metricserver
    安装nginx
    C# Winform应用程序内存回收
    asp.net 数据库访问操作类
  • 原文地址:https://www.cnblogs.com/tomori/p/13457743.html
Copyright © 2011-2022 走看看