AcWing 23. 矩阵中的路径

题目描述

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。

路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。

如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。

注意:

  • 输入的路径不为空;
  • 所有出现的字符均为大写英文字母;

样例

matrix=
[
  ["A","B","C","E"],
  ["S","F","C","S"],
  ["A","D","E","E"]
]

str="BCCE" , return "true" 

str="ASAE" , return "false"

问题分析 

此题还是标准DFS的题。定义一个二维数组point表示某个字符是否被访问过,字符串out表示当前已经匹配的部分,row和col表示当前匹配的最后一个字符的位置坐标。然后先进行整个matrix数组的遍历找到第一个匹配的字符,然后从此字符开始DFS。在DFS函数中依次访问相邻位置的字符,如果某一个相邻的字符匹配则调用DFS函数,如果DFS函数返回true,说明从下一个字符开始都能匹配到,所以当前函数也返回true,否则将point数组和out字符串的状态恢复,准备访问下一个相邻的字符。如果所有相邻的字符都不能顺利匹配下去,那么返回false,表明从当前字符开始的话,到最后是不能匹配的。递归基是out与str等长时,说明已经完全匹配,返回true。在进行整个matrix数组的遍历找到某一个匹配的字符,然后如果此字符的DFS函数返回true的话,那么说明从此字符开始可以完全匹配单词,返回true,否则遍历完整个matrix数组都没有返回true,返回false。

代码实现

class Solution {
public:
    bool hasPath(vector<vector<char>>& matrix, string str) {
        if(matrix.empty())
            return false;
        int m = matrix.size();
        int n = matrix[0].size();
        vector<vector<bool>> point(m, vector<bool>(n, false));
        string out;
        for(int i = 0; i < m; i++)
            for(int j = 0; j < n; j++)
                if(matrix[i][j] == str[0]){
                    point[i][j] = true;
                    out = out + matrix[i][j];
                    if(DFS(out, i, j, matrix, point, str))
                        return true;
                    point[i][j] = false;
                    out = out.substr(0, out.size() - 1);
                }    
        return false;
    }
    
    bool DFS(string& out, int row, int col, vector<vector<char>>& matrix, vector<vector<bool>>& point, string& str){
        if(out.size() == str.size())
            return true;
        if(col > 0 && matrix[row][col-1] == str[out.size()] && point[row][col-1] == false){
            point[row][col-1] = true;
            out = out + matrix[row][col-1];
            if(DFS(out, row, col-1, matrix, point, str))
                return true;
            point[row][col-1] = false;
            out = out.substr(0, out.size() - 1);
        }
        if(row > 0 && matrix[row-1][col] == str[out.size()] && point[row-1][col] == false){
            point[row-1][col] = true;
            out = out + matrix[row-1][col];
            if(DFS(out, row-1, col, matrix, point, str))
                return true;
            point[row-1][col] = false;
            out = out.substr(0, out.size() - 1);
        }
        if(col < matrix[0].size()-1 && matrix[row][col+1] == str[out.size()] && point[row][col+1] == false){
            point[row][col+1] = true;
            out = out + matrix[row][col+1];
            if(DFS(out, row, col+1, matrix, point, str))
                return true;
            point[row][col+1] = false;
            out = out.substr(0, out.size() - 1);
        }
        if(row < matrix.size()-1 && matrix[row+1][col] == str[out.size()] && point[row+1][col] == false){
            point[row+1][col] = true;
            out = out + matrix[row+1][col];
            if(DFS(out, row+1, col, matrix, point, str))
                return true;
            point[row+1][col] = false;
            out = out.substr(0, out.size() - 1);
        }
        return false;
    }
};

猜你喜欢

转载自blog.csdn.net/mengyujia1234/article/details/90048614