剑指offer——矩阵中的路径

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串”bcced”的路径,但是矩阵中不包含”abcb”路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

理解:

本题和“机器人的运动范围”那道题几乎拥有一模一样的思路,把问题聚焦到每一个字母,处理好一个就可以遍历解决问题
相比来说这个题因为起点不固定所以稍微复杂一点。因为起点不固定所以在hasPath中对起点进行了一个遍历,使用了两个for循环嵌套;hasPath中还对flag数组进行了定义。
把递归扫描的过程放到hasPathCore中处理,要让终止条件在先,所以要关注三个if的顺序,首先是搜索失败的情况进行false回退,其次是搜索成功的最终true返回,最后才是一般的递归过程。
需要注意的地方是最后的 flag[index] = 0;如果都没有扫描到就要释放这个起点,标记清空。

public class Solution {
    public boolean hasPath(char[] matrix, int rows, int cols, char[] str)
    {
        int[] flag = new int[matrix.length];
        for(int r = 0; r < rows; r++){
            for(int c = 0; c < cols; c++){
                if(hasPathCore(matrix, rows, cols, r, c, str, 0, flag)){
                    return true;
                }
            }
        }
        return false;
    }

    private boolean hasPathCore(char[] matrix, int rows, int cols, int r, int c, char[] str, int k, int[] flag){
        int index = r*cols+c;
        if(r < 0 || r >= rows || c < 0 || c >= cols || matrix[index] != str[k] || flag[index] == 1){
            return false;
        }

        if(k == str.length-1){  //三个if 的顺序很重要,直接决定了功能的递归实现
            return true;
        }
        flag[index] = 1;

        if(hasPathCore(matrix,rows,cols,r+1,c,str,k+1,flag)
          || hasPathCore(matrix,rows,cols,r-1,c,str,k+1,flag)
          || hasPathCore(matrix,rows,cols,r,c+1,str,k+1,flag)
          || hasPathCore(matrix,rows,cols,r,c-1,str,k+1,flag)){
            return true;
        }
        flag[index] = 0;
        return false;

    }

}









猜你喜欢

转载自blog.csdn.net/RhythmWANG/article/details/80215733