JZ12 矩阵中的路径

剑指Offer编程链接:JZ12

题目描述:

思路:递归+回溯的方法,总结一下什么情况需要使用递归:

递归在解决问题时,通常涉及以下情况:

  1. 问题可被分解为较小的相似子问题。
  2. 子问题与原问题具有相同的结构,只是规模更小。
  3. 每个子问题的解可以通过递归调用来获得。
  4. 存在基本情况,当问题足够小时可以直接求解。

递归适用于许多问题,如数学运算(如阶乘、斐波那契数列)、树结构遍历、图算法、字符串处理等。然而,使用递归时要注意合适的终止条件和避免出现无限递归。

具体做法:

step 1:优先处理矩阵为空的特殊情况。

step 2:设置flag数组记录某一次路径中矩阵中的位置是否被经过,因此一条路径不能回头。

step 3:遍历矩阵,对每个位置进行递归。

step 4:递归查找的时候,到了矩阵的边界或者是下一个字符与这个位置的字符不匹配,或者节点已经访问过了,或者字符串匹配完成都结束递归。

step 5:访问节点,修改flag数组,向其他四个方向延伸,回溯的时候修改flag数组。

代码:

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


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param matrix char字符型二维数组 
     * @param word string字符串 
     * @return bool布尔型
     */
    //i代表数组行,j代表列,matrix代表矩阵,n*m 矩阵,word代表要匹配的字符串,k代表当前第几个字符
    private boolean dfs(char[][] matrix,int n,int m,int i,int j,String word,int k,boolean[][] flag){
        //下标越界、字符不匹配、已经遍历过不能重复
        if(i<0||i>=n||j<0||j>=m||(matrix[i][j]!=word.charAt(k))||(flag[i][j]==true)){
            return false;
        }
        if(k==word.length()-1){
            return true;
        }
        flag[i][j] = true;
        //该结点四个方向
        if(dfs(matrix,n,m,i-1,j,word,k+1,flag)||dfs(matrix,n,m,i+1,j,word,k+1,flag)||dfs(matrix,n,m,i,j-1,word,k+1,flag)||dfs(matrix,n,m,i,j+1,word,k+1,flag)){
            return true;
        }
        //此格未被占用
        flag[i][j] = false;
        return false;
    }
    public boolean hasPath (char[][] matrix, String word) {
        // write code here
        if(matrix.length == 0){
            return false;
        }
        int n = matrix.length;
        int m = matrix[0].length;
        boolean[][] flag = new boolean[n][m];
        for(int i = 0;i<n;i++){
            for(int j = 0;j<m;j++){
                if(dfs(matrix,n,m,i,j,word,0,flag)){
                    return true;
                }
            }
        }
        return false;
    }
}
相关推荐
智购无人售货机厂家2 天前
2026自动售货机品类拓展逻辑:从饮料零食到鲜食药品文创的工程实践~YH
服务器·人工智能·单片机·线性代数·矩阵
IT小白杨2 天前
社媒多账号运营的环境隔离:一张图谱模型,解释清“为什么换IP还是被连坐“
经验分享·笔记·矩阵·指纹浏览器
镜像视界(浙江)科技有限公司3 天前
《视频孪生之上:二维展示终结,三维空间计算重构城市逻辑》——跨摄像连续表达 × 三角测量厘米级定位 × 动态轨迹建模,构建新一代城市空间
大数据·人工智能·算法·矩阵·音视频·空间计算
wzdark3 天前
稀疏矩阵存储结构及其运算复杂度研究4
线性代数·矩阵
零依赖极客4 天前
Day 9·1 KV 也量化——q8 KV 把缓存与 decode 带宽压到一半
c语言·开发语言·arm开发·人工智能·缓存·矩阵
零依赖极客4 天前
Day 6·1 ARMv8.2 dotprod——vdotq_s32 一条指令做 4 个点积
c语言·开发语言·人工智能·矩阵·arm·vllm
wzdark4 天前
基于矩阵的动态规划路径问题性能优化4
线性代数·矩阵·动态规划
Raas1005 天前
MAI Gateway(魔芋企业级AI网关)功能全解:AI网关有哪些功能?一文看懂AI网关能力矩阵
大数据·人工智能·矩阵·gateway·mai gateway·企业级产品
船厂电气自动化ai大模型6 天前
AI大模型与数学 第75课 基、维度、向量空间坐标
数据结构·线性代数·算法·机器学习·推荐算法
hansang_IR7 天前
【题解】P4456 [CQOI2018] 交错序列(矩阵乘法)
c++·线性代数·算法