剑指offer:矩阵中的路径

题意描述

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。

解题思路

一、回溯法

  • 1.根据给定的行列,遍历字符,根据行列数计算出字符位置
  • 2.递归终止条件:(1).行列越界 (2).与路径不匹配 (3).已经走过(需设定一个数组标识当前字符是否走过)
  • 3.若路径中的字符最后一位匹配成功,则到达边界且满足约束条件,找到合适的解
  • 4.递归不断寻找四个方向是否满足条件,满足条件再忘更深层递归,不满足向上回溯
  • 5.如果回溯到最外层,则当前字符匹配失败,将当前字符标记为未走
    public boolean hasPath(char[] matrix, int rows, int cols, char[] str){
            boolean[] flag = new boolean[matrix.length];	//标记当前字符有没有走过
            for(int i=0;i<rows;i++){
                for(int j=0;j<cols;j++){
                    if(helper(matrix, rows, cols, i, j, str, 0, flag)){
                        return true;
                    }
                }
            }
            return false;
        }
        public boolean helper(char[] matrix,int rows,int cols,int i,int j,char[] str,int k,boolean[] flag){
            int index = i * cols + j;	//根据i、j计算出在matrix、flag中的位置
            //越界、不匹配、已经走过,返回false
            if(i<0 || i>=rows || j<0 || j>=cols || matrix[index] != str[k] || flag[index] == true){
                return false;
            }
            if(k == str.length-1) return true;	//走过的长度 = 字符串长度,说明匹配成功
            flag[index] = true;	//标记已经走过
            if(helper(matrix, rows, cols, i - 1, j, str, k + 1, flag)	//向左走
                    || helper(matrix, rows, cols, i + 1, j, str, k + 1, flag)	//向右走
                    || helper(matrix, rows, cols, i, j - 1, str, k + 1, flag)	//向上走
                    || helper(matrix, rows, cols, i, j + 1, str, k + 1, flag))	//向下走
                return true;	
            flag[index]  = false;	//回溯,重置标志位
            return false;
        }
posted @ 2020-04-26 21:21  灵图  阅读(115)  评论(0)    收藏  举报