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;
    }
};


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM