剑指offer 12 矩阵中的路径 思路及代码

                 思路:这是一个典型的二维迷宫问题,首先应该想到的是使用递归回溯的方法去找到正确的路径。

        首先确定测试用例,(空字符串,字符串长度为0,空数组,数组长度为0,矩阵里面包含字符串,不包含字符串)。看到题目要求判断是否包含字符串。首先需要循环遍历找到矩阵中字符与字符串中首位相等的元素下标。进入方法进行递归回溯查找。个人感觉类似于深度遍历的过程。

        最需要注意的是需要避免来回判断,比如{a,a} “aaa” 如果没有考虑到的话很容易导致回头判断的情况。因此判断完一个元素满足要求后需要将其做上标记。我的方法是给一个boolean类型二维数组进行记录。后来看到题解中有一个好方法,将元素的值存入一个成员变量中,把矩阵中的这个元素赋值“/0”。如果判断为否再给他赋值回来。 可以节约一个二维数组的空间。最后如果还需要这个数组。可以在return true 的时候赋值回来。

 

 

class Solution {
   char[][] board;
    String word;
    public boolean exist(char[][] board, String word) {
        //使用递归与回溯的思路
        if(board==null||board.length==0||board[0].length==0||word==null||word.length()==0){
            return false;
        }
        this.board=board;
        this.word=word;

       for(int i=0;i<board.length;i++){
                for(int j =0;j<board[i].length;j++){
                        if(searchWords(i,j,0)){
                            return true;
                        }
                    }
                }
            
            return false;
    }

    public boolean searchWords(int row,int list,int index ){
         if(!isNext(row,list,index)){
                return false;
            }
            if(index>=word.length()-1){
                return true;
            }  
            //上右下左的顺序去找路
            char temp = board[row][list];
            board[row][list]='\0';
            if((searchWords(row+1,list,index+1))||(searchWords(row,list+1,index+1))
            ||(searchWords(row,list-1,index+1))||(searchWords(row-1,list,index+1))  ){
               return true;
            }
            
           board[row][list]=temp;
            return false;
    } 
    public boolean isNext(int row,int list,int index){
        if(row<0||row>=board.length||list<0||list>=board[row].length){
            return false;
        }

        if(word.charAt(index)==board[row][list]){
            return true;
        }
        return false;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值