【剑指Offer】面试题12:矩阵中的路径

本文介绍了一个用于判断在矩阵中是否存在包含特定字符串所有字符路径的算法。路径可从任意位置开始,向四个方向移动,不可重复进入同一格。文章提供了一个具体的实现案例。

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

import java.lang.String;

/**
 * 面试题12:矩阵中的路径
 * 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。
 * 路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。
 * 如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
 * 例如,矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,
 * 因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
 *
 * @author dengjie
 * @create 2021-03-15 13:38
 */
public class Solution12 {
    public static void main(String[] args) {
        String maxtrixs = "ABCESFCSADEE";
        String path = "ABCCED";
        boolean isExit = hasPath(maxtrixs,3,4,path);
        System.out.println(isExit);
    }
    public static boolean hasPath (String matrix, int rows, int cols, String str) {
        boolean[] visited = new boolean[rows * cols];
        char[] maxtrixs = matrix.toCharArray();
        char[] strs  = str.toCharArray();
        //遍历寻找最开始的一个匹配
        for (int i = 0;i<rows;i++){
            for (int j = 0; j< cols; j++){
                if (judge(maxtrixs,strs,visited,rows,cols,i,j,0)){
                    return true;
                }
            }
        }
        return false;
    }
    public static boolean judge(char[] matrixs, char[] strs, boolean[] visited, int rows, int cols, int i, int j,int k){
        int is_visited_pos = i * cols + j;//计算将要访问的字母的下标
        //k代表当已经匹配到几个了
        if (i<0||i>=rows||j<0||j>=cols|| visited[is_visited_pos] ||matrixs[is_visited_pos]!=strs[k]){
            //判断当前位置是否越界、是否访问过(为正确路径的一部分)、当前访问值是否与目标值相等
            return false;
        }
        //如果第k个上面的条件都不满足,并且k等于要匹配的长度,说明已经找到路径
        if (k == strs.length - 1){
            return true;
        }
        //当找到正确的路径,将此点标记为访问过
        visited[is_visited_pos] = true;
        //从当前点出发向上下左右寻找
        if (judge(matrixs,strs,visited,rows,cols,i-1,j,k+1)||
        judge(matrixs,strs,visited,rows,cols,i+1,j,k+1)||
        judge(matrixs,strs,visited,rows,cols,i,j-1,k+1)||
        judge(matrixs,strs,visited,rows,cols,i,j+1,k+1)){
            //通过is_visited_pos寻找到了
            return true;
        }
        //如果没有通过is_visited_pos寻找到,说明is_visited_pos不通,将其重新置为没有访问
        visited[is_visited_pos] = false;
        return false;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值