LeetCode——79. 单词搜索

题目:

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

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

示例:

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

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

思路:

类似图的深度遍历,按照题目的意思,从==word[0]的格子开始深度搜索,当定位到一个格子(i, j)时,下次遍历可以向上下左右四个方向遍历,若当前格子符合条件,则继续深度搜索,当不符合条件就回溯返回false,直到遍历深度==word.len(),依层返回true。所以条件如下:

1、搜索到结果,返回true

2、不满足条件(下标越界、该格子已经出现在线路中、该层与word不匹配),返回false

3、继续朝四个方向深度搜索

bool search(vector>& board, string word, int i, int j, int count, vector> &used){
    //搜索到结果
    if(count == word.size()) //其实这里下标已经超过了
        return true;
    //不满足条件
    if(i < 0 || j < 0 || i == board.size() || j == board[0].size() || used[i][j] || board[i][j] != word[count])
        return false;
    //上下左右分别递归
    if(!used[i][j] && board[i][j] == word[count]){
        used[i][j] = true;
        bool res =  search(board, word, i - 1, j, count + 1, used) ||
                search(board, word, i + 1, j, count + 1, used) ||
                search(board, word, i, j - 1, count + 1, used) ||
                search(board, word, i, j + 1, count + 1, used);
        used[i][j] = false;
        return res;
    }
    return false;
}

bool exist(vector>& board, string word) {
    //初始化used
    vector> used;
    for(int i = 0; i < board.size(); i++){
        used.emplace_back();
        for(int j = 0; j < board[i].size(); j++){
            used[i].push_back(false);
        }
    }
    for(int i = 0; i < board.size(); i++){
        for(int j = 0; j < board[i].size(); j++){
            if(board[i][j] == word[0]){
                if(search(board, word, i, j, 0, used))
                    return true;
            }
        }
    }
    return false;
}

 

你可能感兴趣的:(算法)