65.矩陣中的路徑

題目描述

請設計一個函數,用來判斷在一個矩陣中是否存在一條包含某字符串全部字符的路徑。路徑能夠從矩陣中的任意一個格子開始,每一步能夠在矩陣中向左,向右,向上,向下移動一個格子。若是一條路徑通過了矩陣中的某一個格子,則以後不能再次進入這個格子。 例如 a b c e s f c s a d e e 這樣的3 X 4 矩陣中包含一條字符串"bcced"的路徑,可是矩陣中不包含"abcb"路徑,由於字符串的第一個字符b佔據了矩陣中的第一行第二個格子以後,路徑不能再次進入該格子。

題目解答

public class Solution {
    public boolean hasPath(char[] matrix, int rows, int cols, char[] str){
        if(matrix==null || rows<1 || cols<1 || str==null){
            return false;
        }
        //標誌位初始化爲false
        boolean[] visited=new boolean[matrix.length];
        for(int row=0;row<rows;row++){
            for(int col=0;col<cols;col++){
                //循環遍歷二維數組,找到起點等於str第一個元素的值,再遞歸判斷上下左右是否有符合條件的
                if(hasPathCore(matrix,row,col,rows,cols,visited,str,0)){
                    return true;
                }
            }
        }
        return false;
    }
    
    //k爲字符串的訪問索引
    private boolean hasPathCore(char[] matrix,int row,int col,int rows,int cols,boolean[] visited,char[] str,int k){
        //根據row和col計算第一個元素轉換爲一維數組的位置
        int index=row*cols+col;
        //遞歸終止條件
        if(row<0 || col<0 || row>=rows || col>=cols || matrix[index]!=str[k] || visited[index]==true){
            return false;
        }
        //若k已經到達str末尾了,說明以前的都匹配成功了,直接返回true便可
        if(k==str.length-1){
            return true;
        }
        //要走的第一個位置設置成true,表示已經走過了
        visited[index]=true;
        
        if(k==str.length-1){
            return true;
        }
        
        //回溯(BFS),遞歸尋找,每次找到k+1,找不到,還原
        if(hasPathCore(matrix,row-1,col,rows,cols,visited,str,k+1)||
           hasPathCore(matrix,row+1,col,rows,cols,visited,str,k+1)||
           hasPathCore(matrix,row,col-1,rows,cols,visited,str,k+1)||
           hasPathCore(matrix,row,col+1,rows,cols,visited,str,k+1)){
            return true;
        }
        //走到這,說明這條路不通,還原,再試其餘的路徑
        visited[index]=false;
        return false;
    }
}
相關文章
相關標籤/搜索