import java.lang.String;
/**
* 面试题12:矩阵中的路径
* 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。
* 路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。
* 如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
* 例如,矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,
* 因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
*
* @author dengjie
* @create 2021-03-15 13:38
*/
public class Solution12 {
public static void main(String[] args) {
String maxtrixs = "ABCESFCSADEE";
String path = "ABCCED";
boolean isExit = hasPath(maxtrixs,3,4,path);
System.out.println(isExit);
}
public static boolean hasPath (String matrix, int rows, int cols, String str) {
boolean[] visited = new boolean[rows * cols];
char[] maxtrixs = matrix.toCharArray();
char[] strs = str.toCharArray();
//遍历寻找最开始的一个匹配
for (int i = 0;i<rows;i++){
for (int j = 0; j< cols; j++){
if (judge(maxtrixs,strs,visited,rows,cols,i,j,0)){
return true;
}
}
}
return false;
}
public static boolean judge(char[] matrixs, char[] strs, boolean[] visited, int rows, int cols, int i, int j,int k){
int is_visited_pos = i * cols + j;//计算将要访问的字母的下标
//k代表当已经匹配到几个了
if (i<0||i>=rows||j<0||j>=cols|| visited[is_visited_pos] ||matrixs[is_visited_pos]!=strs[k]){
//判断当前位置是否越界、是否访问过(为正确路径的一部分)、当前访问值是否与目标值相等
return false;
}
//如果第k个上面的条件都不满足,并且k等于要匹配的长度,说明已经找到路径
if (k == strs.length - 1){
return true;
}
//当找到正确的路径,将此点标记为访问过
visited[is_visited_pos] = true;
//从当前点出发向上下左右寻找
if (judge(matrixs,strs,visited,rows,cols,i-1,j,k+1)||
judge(matrixs,strs,visited,rows,cols,i+1,j,k+1)||
judge(matrixs,strs,visited,rows,cols,i,j-1,k+1)||
judge(matrixs,strs,visited,rows,cols,i,j+1,k+1)){
//通过is_visited_pos寻找到了
return true;
}
//如果没有通过is_visited_pos寻找到,说明is_visited_pos不通,将其重新置为没有访问
visited[is_visited_pos] = false;
return false;
}
}
【剑指Offer】面试题12:矩阵中的路径
最新推荐文章于 2024-01-06 17:26:00 发布