美文网首页
矩阵中的路径

矩阵中的路径

作者: mengkaidi | 来源:发表于2020-07-09 15:32 被阅读0次

    题目描述

    请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出),结果应该返回true。

    [["a","b","c","e"],
    ["s","f","c","s"],
    ["a","d","e","e"]]

    但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子,结果应该返回false。

    解题思路

    深度优先搜索:遍历矩阵中字符,先朝一个方向搜索,在搜索过程中,如果遇到这条路不可能和目标字符串匹配成功的情况,则应立即返回,并回溯到上一个节点,沿另一个方向搜索。此外,需要注意沿着一个方向搜索的过程中,已经访问过的节点需要做标记。C++实现如下:

    class Solution {
    public:
        bool dfs(vector<vector<char>>& board, int i, int j, string &word, int k){
           // 坐标越界或者当前坐标和字符串的当前元素不匹配时
            if(i>=board.size() || i<0 || j<0 || j>=board[0].size() || board[i][j] != word[k])
                return false;
            // board[i][j] = word[k]
            if(k==word.size()-1)
                return  true;
            char tmp = board[i][j];
           // 对当前路径下访问过的坐标做标记
            board[i][j]= '/';
           // 递归朝着下或上或右或左的方向比较下一个元素是否匹配
            bool res = dfs(board, i+1, j, word, k+1) || dfs(board, i-1, j, word, k+1) || dfs(board, i, j+1, word, k+1) || dfs(board, i, j-1, word, k+1)
           // 回溯时需要将被访问过的标记去掉
            board[i][j] = tmp;
            return res;
    
        }
        bool exist(vector<vector<char>>& board, string word) {
            // i  j 为节点坐标,k为字符串中字符下标
            for(int i=0; i<board.size(); i++){
                for(int j=0; j<board[0].size(); j++){
                    if(dfs(board, i, j, word, 0))
                        return true;
                }
            }
            return false;
        }
    };
    

    相关文章

      网友评论

          本文标题:矩阵中的路径

          本文链接:https://www.haomeiwen.com/subject/hicscktx.html