- 题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
- 思路:
- 在这个矩阵中找到匹配上字符串首字母的位置,然后从这个位置开始dfs查找字符串
- 启发或者坑:
- dfs尝试之后,要复位
- 代码:
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; } };
剑指offer 44.矩阵中的路径
猜你喜欢
转载自blog.csdn.net/Alexia23/article/details/104092940
今日推荐
周排行