• 剑指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();
    }

    }

  • 相关阅读:
    leetcode(85)最大矩形
    红黑树
    查询学生成绩表中大于60分的每一个成绩的人数
    聚合函数以及SQL中的一些小知识
    Oracle的JDBC
    StringBuffer的reverse方法
    查询时报第一页没有数据,第二页有数据的异常
    普通人如何从平庸到优秀,在到卓越
    HDMI、DVI、VGA等这些接口
    显卡上的VGA接口和高清接口有什么区别?
  • 原文地址:https://www.cnblogs.com/zhuozige/p/12442805.html
Copyright © 2020-2023  润新知