• lintcode-123-单词搜索


    123-单词搜索

    给出一个二维的字母板和一个单词,寻找字母板网格中是否存在这个单词。
    单词可以由按顺序的相邻单元的字母组成,其中相邻单元指的是水平或者垂直方向相邻。每个单元中的字母最多只能使用一次。

    样例

    给出board =
    [
    "ABCE",
    "SFCS",
    "ADEE"
    ]
    word = "ABCCED", ->返回 true,
    word = "SEE",-> 返回 true,
    word = "ABCB", -> 返回 false.

    标签

    回溯法 脸书

    思路

    使用DFS,先在 board 中搜索 word 中第一个字符,再以此字符为起点进行 DFS 搜索,若搜索出的路径与 word 一致,则在网格中存在此单词。
    此外,参考[https://segmentfault.com/a/1190000003697153](https://segmentfault.com/a/1190000003697153] 如下:

    为了避免循环搜索,我们还要将本轮深度优先搜索中搜索过的数字变一下,等递归回来之后再变回来。实现这个特性最简单的方法就是异或上一个特定数,然后再异或回来。

    code

    class Solution {
    public:
        /**
         * @param board: A list of lists of character
         * @param word: A string
         * @return: A boolean
         */
        bool exist(vector<vector<char> > &board, string word) {
            // write your code here
            int sizeRow = board.size(), sizeStr = word.size();
            if(sizeRow <= 0 || sizeStr <= 0) {
                return false;
            }
    
            int sizeCol = board[0].size(), i = 0, j = 0;
            stack<pair<int, int> > path;
    
            for(i=0; i<sizeRow; i++) {
                for(j=0; j<sizeCol; j++) {
                    if(board[i][j] == word[0]) {
                        bool isFind = DFSFind(board, word, i, j, 0);
                        if(isFind) {
                            return true;
                        }
                    }
                }
            }
    
            return false;
        }
    
        bool DFSFind(vector<vector<char> > &board, string word, int i, int j, int wordStart) {
            if(wordStart == word.size()) {
                return true;
            }
            else if(i<0 || i>=board.size() || j<0 || j>= board[0].size() || 
                    board[i][j]!=word[wordStart])
            {
                return false;
            } 
    
            board[i][j] ^= 255;
            bool result = (DFSFind(board, word, i-1, j,   wordStart+1) 
                        || DFSFind(board, word, i,   j-1, wordStart+1) 
                        || DFSFind(board, word, i+1, j,   wordStart+1) 
                        || DFSFind(board, word, i,   j+1, wordStart+1));
    
            board[i][j] ^= 255;
            return result;
        }
    };
    
  • 相关阅读:
    安装selenium
    虚拟机安装Linux系统
    Pycharm安装+python安装+环境配置
    shell命令
    单例模式
    装饰者模式
    AtomicInteger的CAS原理
    J.U.C总览图
    锁机制(四)
    锁机制(三)
  • 原文地址:https://www.cnblogs.com/libaoquan/p/7210602.html
Copyright © 2020-2023  润新知