剑指offer:矩阵中的路径

博客围绕判断矩阵中是否存在包含某字符串所有字符的路径展开。先给出题目描述,接着介绍用回溯法解决该问题的思路,包括遍历矩阵找起始字符、处理相邻字符匹配及回退情况,还提到用递归实现,最后给出参考博客链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

 

思路:

回溯法

本题是回溯法解决的典型问题,

step1:遍历这个矩阵,我们很容易就能找到与字符串str中第一个字符相同的矩阵元素ch。然后遍历ch的上下左右四个字符,如果有和字符串str中下一个字符相同的,就把那个字符当作下一个字符(下一次遍历的起点),如果没有,就需要回退到上一个字符,然后重新遍历。为了避免路径重叠,需要一个辅助矩阵来记录路径情况。

step2:如果4个相邻的格子都没有匹配字符串中下标为k+1的字符,表明当前路径字符串中下标为k的字符在矩阵中的定位不正确,我们需要回到前一个字符串(k-1),然后重新定位。

一直重复这个过程,直到路径字符串上所有字符都在矩阵中找到格式的位置(此时str[k] == '\0')。

回溯的方法,一般我们都采取递归来解决。

 

实现:

public class Solution {
    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(judge(matrix,i,j,rows,cols,flag,str,0)){
                    return true;
                }
            }
        }
        return false;
    }
     
    private boolean judge(char[] matrix,int i,int j,int rows,int cols,boolean[] flag,char[] str,int k){
        int index=i*cols+j;
        if(i<0||j<0||i>=rows||j>=cols||matrix[index]!=str[k]||flag[index]){
            return false;
        }
        if(k==str.length-1){
            return true;
        }
        flag[index]=true;
        //上下左右遍历
        if(judge(matrix,i-1,j,rows,cols,flag,str,k+1)||
          judge(matrix,i+1,j,rows,cols,flag,str,k+1)||
          judge(matrix,i,j-1,rows,cols,flag,str,k+1)||
          judge(matrix,i,j+1,rows,cols,flag,str,k+1)){
            return true;
        }
        //否则回溯
        flag[index]=false;
        return false;
    }
 
 
}

 

参考博客:

https://cuijiahua.com/blog/2018/02/basis_65.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值