面试题十二:矩阵中的路径

判断矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中任意一格开始,向左右上下移动,路径不重复
方法:递归回溯,回溯法适合又多个步骤组成的问题

boolean hasPath( char [][] matrix, int rows ,int cols,char[] str){

        if(matrix==null || rows<1||cols<1|| str==null)
            return false;

        int[][] boolary=new int [rows][cols];  //作为位置标示符,可不可走
        int lengthPath=0;
        //遍历数组,每个元素都能为开头
        for(int i=0;i<rows;i++)
            for(int j=0;j<cols;j++)
                if(   f1 (matrix, rows, cols, i, j, str,lengthPath, boolary) )
                    return true;
        return false;
    }

    boolean f1(char [][] matrix, int rows ,int cols, int i, int j,char[ ] str, int lengthPath, int [][]boolary)
    {
        if(lengthPath>=str.length)   //说明是否能匹配到字符串尾部
            return true;


        boolean hasPath=false;  //标示符

        //当前位置,下标不越界, 下标能比较,下标与字符串值匹配,
        if(i>=0 && i<rows && j>=0 && j<cols &&
        matrix[ i ] [ j] ==str[ lengthPath] &&
                boolary[i][j] ==0)
        {
            lengthPath++;      //比较下一个字符1
            boolary[ i ] [ j]=1;   //防止被再次匹配

        }
        //按顺序左右上下比较,有一个方向找到就返回真
        hasPath= f1(matrix, rows, cols, i, j-1, str, lengthPath, boolary)
                  ||f1(matrix, rows, cols, i, j+1, str, lengthPath, boolary)
                        || f1(matrix, rows, cols, i-1, j, str, lengthPath, boolary)
                            || f1(matrix, rows, cols, i+1, j, str, lengthPath, boolary) ;
        //如果下面的路走不通,则重新比较;
        if( ! hasPath ){
            lengthPath--;
            boolary[ i ] [ j]=0;

        }

        return  hasPath;

    }

 

posted @ 2020-03-29 14:27  浪波激泥  阅读(200)  评论(0编辑  收藏  举报