剑指offer:矩阵中的路径
题意描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
解题思路
一、回溯法
- 1.根据给定的行列,遍历字符,根据行列数计算出字符位置
- 2.递归终止条件:(1).行列越界 (2).与路径不匹配 (3).已经走过(需设定一个数组标识当前字符是否走过)
- 3.若路径中的字符最后一位匹配成功,则到达边界且满足约束条件,找到合适的解
- 4.递归不断寻找四个方向是否满足条件,满足条件再忘更深层递归,不满足向上回溯
- 5.如果回溯到最外层,则当前字符匹配失败,将当前字符标记为未走
public boolean hasPath(char[] matrix, int rows, int cols, char[] str){
boolean[] flag = new boolean[matrix.length]; //标记当前字符有没有走过
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
if(helper(matrix, rows, cols, i, j, str, 0, flag)){
return true;
}
}
}
return false;
}
public boolean helper(char[] matrix,int rows,int cols,int i,int j,char[] str,int k,boolean[] flag){
int index = i * cols + j; //根据i、j计算出在matrix、flag中的位置
//越界、不匹配、已经走过,返回false
if(i<0 || i>=rows || j<0 || j>=cols || matrix[index] != str[k] || flag[index] == true){
return false;
}
if(k == str.length-1) return true; //走过的长度 = 字符串长度,说明匹配成功
flag[index] = true; //标记已经走过
if(helper(matrix, rows, cols, i - 1, j, str, k + 1, flag) //向左走
|| helper(matrix, rows, cols, i + 1, j, str, k + 1, flag) //向右走
|| helper(matrix, rows, cols, i, j - 1, str, k + 1, flag) //向上走
|| helper(matrix, rows, cols, i, j + 1, str, k + 1, flag)) //向下走
return true;
flag[index] = false; //回溯,重置标志位
return false;
}

浙公网安备 33010602011771号