LeetCode算法系列:79. Word Search

版权声明:由于一些问题,理论类博客放到了blogger上,希望各位看官莅临指教https://efanbh.blogspot.com/;本文为博主原创文章,转载请注明本文来源 https://blog.csdn.net/wyf826459/article/details/82886545

题目描述:

Given a 2D board and a word, find if the word exists in the grid.

The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.

Example:

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

Given word = "ABCCED", return true.
Given word = "SEE", return true.
Given word = "ABCB", return false.

算法实现:

还是递归的方法,我们要分别判断从该字符矩阵的某一个位置开始能否得到所给的的word(判断所有位置)

对于判断从某一个位置开始能否匹配word具体如下:

  • 写一个递归算法判断从某一个位置开始能否匹配word中从wi处之后的字符
  • 匹配成功等价于下面的条件
    • 首先如果board在指定位置的字符和word的wi处的字符匹配
    • 指定位置的左,右,上,下四个位置中的某一个能与word中的wi+1处开始的字符匹配
class Solution {
public:
    int m, n, l;
    bool exist(vector<vector<char>>& board, string word) {
        if(word.empty())return true;
        if(board.empty())return false;
        m = board.size();
        n = board[0].size();
        l = word.length();
        // cout << l<< endl;
        //false表示还没有被使用,而true则表示已经被使用
        vector<vector<bool>> mark(m,vector<bool>(n));
        // if(existnow(0,0,board,word, 0, mark))return true;
        for(int i = 0; i < m; i ++)
            for(int j = 0; j < n; j ++)
                if(existnow(i,j,board,word, 0, mark))return true;
        return false;
    }
    bool existnow(int mm, int nn, vector<vector<char>>& board, string word, int wi, vector<vector<bool>> &mark){
        if(board[mm][nn] != word[wi])return false;
        // cout << mm << "," << nn << "," << wi << endl;
        mark[mm][nn] = true;
        if(wi == l - 1)return true;
        if(nn + 1 < n && !mark[mm][nn + 1] && existnow(mm, nn + 1, board, word, wi + 1, mark))return true;
        if(nn - 1 >= 0 && !mark[mm][nn - 1] && existnow(mm, nn - 1, board, word, wi + 1, mark))return true;
        if(mm + 1 < m && !mark[mm + 1][nn] && existnow(mm + 1, nn, board, word, wi + 1, mark))return true;
        if(mm - 1 >= 0 && !mark[mm - 1][nn] && existnow(mm - 1, nn, board, word, wi + 1, mark))return true;
        mark[mm][nn] = false;
        return false;
    }
};

猜你喜欢

转载自blog.csdn.net/wyf826459/article/details/82886545
今日推荐