剑指Offer(Java版)第十一题(解法一):请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。 路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。 如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。 例如在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用下划线标出)。

/*请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。
路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。
如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。
例如在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用下划线标出)。
但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,
路径不能再次进入这个格子。
A B T G
C F C S
J D E H
*/
//参考的网上的例子,结果存疑,思路可以借鉴
import java.util.*;

public class Class11 {

public boolean findPath(char[] matrix, int rows, int cols, char[] str){
if(matrix == null || rows <= 0 || cols <= 0 || str == null){
return false;
//throw new RuntimeException("输入的数据不符合要求");
}
boolean[] isFinded = new boolean[rows * cols];
for(boolean f : isFinded){
f = false;
}
int pathLength = 0;
for(int row = 0; row < rows; row++){
for(int col = 0; col < cols; col++){
if(findPathMain(matrix,rows,cols,row,col,str,pathLength,isFinded)){
return true;
}
}
}
return false;
}

public boolean findPathMain(char[] matrix, int rows, int cols, int row, int col, char[] str, int pathLength, boolean[] isFinded){
if(row < 0 || col < 0 || row > rows || col > cols || isFinded[row*cols + col] == true || str[pathLength] != matrix[row*cols + col]){
return false;
}
if(pathLength == str.length - 1){
return true;
}
boolean findPath = false;
isFinded[row*cols + col] = true;
findPath = findPathMain(matrix,rows - 1,cols,row,col,str,pathLength + 1,isFinded)
||findPathMain(matrix,rows + 1,cols,row,col,str,pathLength + 1,isFinded)
||findPathMain(matrix,rows,cols - 1,row,col,str,pathLength + 1,isFinded)
||findPathMain(matrix,rows,cols + 1,row,col,str,pathLength + 1,isFinded);
if(!findPath){
isFinded[row*cols + col]= false;
}
return findPath;

}
public void test1() {
char[] matrix = "ABTGCFCSJDEH".toCharArray();
int rows = 3;
int cols = 4;
char[] str = "abfb".toCharArray();
if (!findPath(matrix, rows, cols, str))
System.out.println("Test1 passed.");
else
System.out.println("Test1 failed.");
}
public void test2() {
char[] matrix = "ABTGCFCSJDEH".toCharArray();
int rows = 3;
int cols = 4;
char[] str = "ABFB".toCharArray();
if (!findPath(matrix, rows, cols, str))
System.out.println("Test2 passed.");
else
System.out.println("Test2 failed.");
}

public static void main(String[] args) {
// TODO Auto-generated method stub
Class11 c = new Class11();
c.test1();
c.test2();
}

}

posted on 2020-03-08 15:34  桌子哥  阅读(344)  评论(0编辑  收藏  举报