剑指offer 44.矩阵中的路径

  1. 题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
  2. 思路:
    1. 在这个矩阵中找到匹配上字符串首字母的位置,然后从这个位置开始dfs查找字符串
  3. 启发或者坑:
    1. dfs尝试之后,要复位
  4. 代码:
    class Solution {
    public:
        string matrixStr;
        string targetStr;
        vector<int> mark;
        int colsV;
        int rowsV;
        bool hasPath(char* matrix, int rows, int cols, char* str)
        {
            matrixStr = matrix;
            targetStr = str;
            rowsV = rows;
            colsV = cols;
            for (int i = 0; i < rowsV*colsV; i++)
                mark.push_back(-1);
            if (targetStr.length() == 0)
                return true;
            if (matrixStr.length() == 0)
                return false;
            for (int i = 0; i < rowsV; i++) {
                for (int j = 0; j < colsV; j++) {
                    int index = i * colsV + j;
                    if (matrixStr[index] == targetStr[0]) {
                        //cout << "start find, i: " << i << " j: " << j << endl;
                        //考虑到目标字符串只有一个字符
                        mark[index] = 1;
                        if (targetStr.length()==1 || dfs(i, j, 1))
                            return true;
                        mark[index] = -1;
                    }
                }
            }
            return false;
        }
         
        bool dfs(int start_x, int start_y, int strIndex) {
            //从这个位置startx,starty,向四面八方走,找str[strIndex]
            //cout << "start dfs, start_x: " << start_x << " start_y: " << start_y << " strIndex: " << strIndex << endl;
            /*for (int i = 0; i < mark.size(); i++) {
                cout << mark[i] << " ";
            }
            cout << endl;*/
            int xChange[4] = {0, 0, 1, -1};
            int yChange[4] = {1, -1, 0, 0};
            for (int i = 0; i < 4; i++) {
                int x = start_x + xChange[i];
                int y = start_y + yChange[i];
                if (x < 0 || x >= rowsV)
                    continue;
                if (y < 0 || y >= colsV)
                    continue;
                int index = x * colsV + y;
                if (mark[index] == 1)
                    continue;
                if (matrixStr[index] != targetStr[strIndex])
                    continue;
                else {
                    if (strIndex == targetStr.length()-1)
                        return true;
                    mark[index] = 1;
                    bool res = dfs (x, y, strIndex+1);
                    if (res)
                        return true;
                    mark[index] = -1;
                }
            }
            return false;
        }
    };
发布了131 篇原创文章 · 获赞 5 · 访问量 7381

猜你喜欢

转载自blog.csdn.net/Alexia23/article/details/104092940