首页 > 其他分享 >剑指 Offer 12. 矩阵中的路径

剑指 Offer 12. 矩阵中的路径

时间:2023-05-18 23:01:06浏览次数:47  
标签:12 word Offer int 路径 矩阵 dfs board

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。

[["a","b","c","e"],
["s","f","c","s"],
["a","d","e","e"]]

但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。

示例 1:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
示例 2:

输入:board = [["a","b"],["c","d"]], word = "abcd"
输出:false

答案


class Solution {
    public boolean exist(char[][] board, String word) {

      int  length1=board[0].length;//列数
      int  length2=board.length;//行数

        for(int i =0; i<length2;i++){
            for(int j=0;j<length1;j++){
                if(board[i][j]==word.charAt(0))
                 if(dfs(board,i,j,word,0))
                    return true;
                    
               
            }
        }

        return false;

    }


    public boolean dfs(char[][] board,int i, int j, String word, int u){

      int  length1=board[0].length;//列数
      int  length2=board.length;//行数
        //失败:先判断边界值
        if(i<0||i>=length2||j<0||j>=length1||board[i][j]!=word.charAt(u)){
            return false;
        }

        //成功:遍历到最后一个
        if(u==word.length()-1)
            return true;
        //覆盖原来防止重复
        char temp = board[i][j];


        board[i][j]= '#';
        //递归调用

        boolean res = dfs(board,i-1,j,word,u+1) || dfs(board,i+1,j,word,u+1) || dfs(board,i,j-1,word,u+1)
        || dfs(board,i,j+1,word,u+1) ;

        //递归结束


        board[i][j]= temp;


        return res;





    }










}


/*
charAt(int index) 
返回 char指定索引处的值。

*/

标签:12,word,Offer,int,路径,矩阵,dfs,board
From: https://blog.51cto.com/hiszm/6307610

相关文章

  • AtCoder Regular Contest 124 F Chance Meeting
    洛谷传送门AtCoder传送门感觉挺高妙的……为了方便,不妨把横纵坐标都整体减\(1\)。如果单独考虑上下移动,方案数是\(\binom{2n}{n}\)。发现两个人上下总共移动\(n\)次后一定会在同一行,设这行编号为\(x\),那么最后带个\(\binom{n}{x}^2\)的系数,并且除掉上下移动后方案本质......
  • leetcode-1207-easy
    UniqueNumberofOccurencesGivenanarrayofintegersarr,returntrueifthenumberofoccurrencesofeachvalueinthearrayisuniqueorfalseotherwise.Example1:Input:arr=[1,2,2,1,1,3]Output:trueExplanation:Thevalue1has3occurrences,......
  • leetcode-1128-easy
    NumberofEquivalentDominoPairsGivenalistofdominoes,dominoes[i]=[a,b]isequivalenttodominoes[j]=[c,d]ifandonlyifeither(a==candb==d),or(a==dandb==c)-thatis,onedominocanberotatedtobeequaltoanotherdomino.R......
  • leetcode-1295-easy
    FindNumberswithEvenNumberofDigitsGivenanarraynumsofintegers,returnhowmanyofthemcontainanevennumberofdigits.Example1:Input:nums=[12,345,2,6,7896]Output:2Explanation:12contains2digits(evennumberofdigits).345cont......
  • 酷睿i7 12700k和i7 12700kf的区别 i712700k和i712700kf差多少
    i7-12700同12700K一样,也是采用的8大+4小,共12核20线程的设计,三级缓存也是25M。但是不支持超频,最大睿频为4.9GHz(12700K为5.0GHz)。组装电脑选i712700k还是i712700kf怎么搭配更合适这些点很重要 http://www.adiannao.cn/duTDP功耗为65W,最大睿频功耗约180W。自带了新款的RM1散热,新款......
  • AtCoder Beginner Contest 212 F Greedy Takahashi
    洛谷传送门AtCoder传送门考虑每条边,因为是静态的,所以可以预处理出\(f_{i,j},g_{i,j}\)表示从第\(i\)条边,往后跳\(2^j\)条边,跳到边的编号和目前的时间(如果不存在就当作跳到第\(0\)条边)。直接倍增处理即可。询问就是找到从\(u\)开始的出边,能跳尽量跳。注意一些细节......
  • 剑指 Offer 35. 复杂链表的复制
    题目描述:请实现copyRandomList函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个next指针指向下一个节点,还有一个random指针指向链表中的任意节点或者null。    提示:-10000<=Node.val<=10000Node.random 为空(null)或指向链表中的节点。节点数目......
  • R5 7530U和i5 12500h选哪个 R57530U和i512500h对比
    R57530U采用Zen3架构为6核12线程,3MB二级缓存,16MB三级缓存选R57530U还是i512500h这些点很重要看过你就懂了http://www.adiannao.cn/dyi512500H为4大核8小核,12核心16线程设计,CPU主频2.5GHz最高睿频4.5GHz三级缓存为18MB功耗(TDP)45W ......
  • 《程序员修炼之道:从小工到专家》12
    何时使用异常和怎样配平资源 在web编程时会用到异常,单反程序不能按照预想正常运行时就会调用异常终止程序 配平资源感觉是对程序的优化,合理的分配资源,如动态分配内存之后及时释放,避免两个进程相互调用时陷入等待的死循环等......
  • 34、byte类型127+1等于多少
    byte的范围是-128~127。字节长度为8位,最左边的是符号位,而127的二进制为01111111,所以执行+1操作时,01111111变为10000000。大家知道,计算机中存储负数,存的是补码的兴衰。左边第一位为符号位。那么负数的补码转换成十进制如下:一个数如果为正,则它的原码、反码、补码相同;一个正数的......