zoukankan      html  css  js  c++  java
  • 【12】(难&精)【DFS】矩阵中的路径

    题目

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

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

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

    思路

    我第一反应是,创建一个记录访问的数组,然后往四个方向,递归,这个思路可行,但是量大。
    在题解里看到一个十分巧妙的方法

    收获

    用暂时更改元素来取代创建记录数组,然后递归,这个方法是dfs的变体
    用统一判断是否越界来减少代码量,神了!!
    dfs函数内的几个判断语句都十分出色

    代码

    class Solution {
    
        public boolean exist(char[][] board, String word) {
            char[] cword = word.toCharArray();
            int index=0;
            for(int i =0;i<board.length;i++)
                for (int j =0;j<board[0].length;j++) {
                    if(dfs(i,j,board,cword,index))return true;
                }
            return false;
        }
        public boolean dfs(int i,int j,char[][] board,char[] word,int index){
            if(i>=board.length||j>=board[0].length||i<0||j<0) return false;
            if(word[index]!=board[i][j]) return false;//如果写 if(word[index]==board[i][j]) return false 代码则出错,思考
            if(index==word.length-1) return true;
            //手法
            char tmp = board[i][j];
            board[i][j] ='\';
            boolean ans = (dfs(i+1,j,board,word,index+1)||dfs(i,j+1,board,word,index+1)
                        || dfs(i-1,j,board,word,index+1)||dfs(i,j-1,board,word,index+1));
            board[i][j] = tmp;
            return ans;
        }
    }
    
    个人小站:http://jun10ng.work/ 拥抱变化,时刻斗争,走出舒适圈。
  • 相关阅读:
    JVM调优
    Java堆空间的划分:新生代、老年代
    说一下 jvm 有哪些垃圾回收器?
    JVM的垃圾回收算法有哪些
    订单并发处理--悲观锁和乐观锁、任务队列以及订单模块开发流程
    MySQL数据库的四种事务隔离级别以及事务的并发问题(脏读/不可重复读/幻读)
    Python面试总结复习(四)
    Python面试总结复习(三)
    Django表设计,多表操作复习
    python面试总结复习(二)
  • 原文地址:https://www.cnblogs.com/Jun10ng/p/12347849.html
Copyright © 2011-2022 走看看