123. 单词搜索(DFS)

描述

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

样例

给出
board =
[
"ABCE",
"SFCS",
"ADEE"
]

word = "ABCCED", ->返回 true,
word = "SEE",-> 返回 true,
word = "ABCB", -> 返回 false.

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
                // write your code here
        vector< vector<bool> > mask(board.size(), vector<bool>(board[0].size(), false));
        for (int i=0; i<board.size(); ++i) {
            for (int j=0; j<board[0].size(); ++j) {
                if (search(board, word, mask, i, j, 0) ) {
                    return true;
                }
            }
        }
        return false;
    }
    
    bool search(vector< vector<char> >& board, string word, vector< vector<bool> >& mask, int i, int j, int idx) {
        if (word[idx]==board[i][j]) {
            mask[i][j] = true;
            ++idx;
            if (idx == word.size()) return true;
            else if (i-1>=0 && !mask[i-1][j] && search(board, word, mask, i-1, j, idx)) return true;
            else if (i+1< board.size() && !mask[i+1][j] && search(board, word, mask, i+1, j, idx)) return true;
            else if (j-1>=0 && !mask[i][j-1]&& search(board, word, mask, i, j-1, idx)) return true;
            else if (j+1< board[0].size() && !mask[i][j+1] && search(board, word, mask, i, j+1, idx)) return true;
            else {
                mask[i][j] = false;
                return false;
            }
        }
    }
};
posted @ 2018-10-18 22:10  narjaja  阅读(360)  评论(0编辑  收藏  举报