【剑指Offer】12.矩阵中的路径

题目

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

数据范围:0≤n,m≤20 , 1≤len≤25

示例1

输入:\[a,b,c,e,s,f,c,s,a,d,e,e],"abcced"

返回值:true

示例2

输入:\[a,b,c,e,s,f,c,s,a,d,e,e],"abcb"

返回值:false

解答

源代码

java 复制代码
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param matrix char字符型二维数组 
     * @param word string字符串 
     * @return bool布尔型
     */
    public boolean hasPath(char[][] matrix, String word) {
        // write code here
        for (int i = 0;i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                if (dfs(matrix, word.toCharArray(), i, j, 0)) {
                    return true;
                }
            }
        }

        return false;
    }

    public boolean dfs(char[][] matrix, char[] word, int i, int j, int index) {
        if (i < 0 || i >= matrix.length || j < 0 || j >= matrix[0].length || matrix[i][j] != word[index]) {
            return false;
        }

        if (index == word.length - 1) {
            return true;
        }

        char temp = matrix[i][j];
        matrix[i][j] = '.';
        boolean result = dfs(matrix, word, i - 1, j, index + 1) || 
                        dfs(matrix, word, i + 1, j, index + 1) ||
                        dfs(matrix, word, i, j - 1, index + 1) ||
                        dfs(matrix, word, i, j + 1, index + 1);
        matrix[i][j] = temp;

        return result;
    }
}

总结

递归回溯,越界或当前字符和所需的不等则返回false,否则判断当前是否为字符串的最后一个字符,是则返回true。最后进行递归,向当前字符的上下左右移动,回溯前将当前字符标记以防止重复经过,回溯结束之后将字符转换回来。

相关推荐
时间静止不是简史1 小时前
生产事故排查:Redis 宕机导致补偿队列消费线程死亡,通话录音未上送业务平台
java·redis
2301_32241428044 小时前
基于SpringBoot+Vue的休闲零食超市管理系统的设计与实现59004-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·redis·mysql·决策树·推荐算法
徐小夕6 小时前
花了3个月,我们做了一款 AI 版的“飞书文档”
前端·算法·github
Robert--cao6 小时前
移动底盘与机械臂联合规划:开源算法与工程实现
算法
金銀銅鐵6 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
福建佰胜张工7 小时前
SMC 薄型气爪 MHF2-16D1 深度解析:平行开闭、低剖面结构在自动化装配中的选型与落地
java·服务器·安全·自动化
小豆庄7 小时前
Mac 上给视频人脸打码:本地工具的依赖、追踪与推理管线
算法·视觉检测·视频·敏捷流程·纹理贴图
catoop7 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现
java·数据库·安全
星夜离尘567 小时前
MATLAB 工程实验:从相邻块均值手写重叠 Allan 偏差,数清有效项
算法·matlab·均值算法
system_error_x7 小时前
SpringBoot 集成 Thymeleaf 简洁入门
java·spring boot·后端