/* 請設計一個函數,用來判斷在一個矩陣中是否存在一條包含某字符串全部字符的路徑。 路徑能夠從矩陣中的任意一個格子開始,每一步能夠在矩陣中向左,向右,向上,向下移動一個格子。 若是一條路徑通過了矩陣中的某一個格子,則該路徑不能再進入該格子。 舉個栗子: 例如在下面的3*4的矩陣中包含一條字符串」bcced」的路徑。
但矩陣中不包含字符串「abcb」的路徑,由於字符串的第一個字符b佔據了矩陣中的第一行第二格子以後,路徑不能再次進入這個格子。 a b c e s f c s a d e e */
思路,回溯法DFSjava
import java.util.*; public class Solution { public static char[] matrix; public static int rows; public static int cols; public static char[] str; public static boolean[]flag;//標誌是否已經進入過 public boolean hasPath(char[] matrix, int rows, int cols, char[] str){ //標誌位,初始化爲false this.matrix = matrix; this.rows = rows; this.cols = cols; this.str = str; flag = new boolean[matrix.length]; for(int i=0; i<rows; i++){ for(int j=0; j<cols; j++){ //循環遍歷二維數組,找到起點等於str第一個元素的值,再遞歸判斷四周是否有符合條件的----回溯法 if(dfs(i,j,0)){ return true; } } } return false; } //dfs(索引行座標i,索引縱座標j,待判斷的字符串的索引k) private boolean dfs(int i,int j,int k){ //先根據i和j計算匹配的第一個元素轉爲一維數組的位置 int index = i*cols+j; //遞歸終止條件 if(i<0 || i>=rows || j<0 || j>=cols || flag[index] || matrix[index] != str[k]){ return false; } //若k已經到達str末尾了,說明以前的都已經匹配成功了,直接返回true便可 if(k == str.length-1){ return true; } //要走的第一個位置置爲true,表示已經走過了 flag[index] = true; //回溯,遞歸尋找,每次找到了就給k加一,找不到,還原 if(dfs(i-1,j,k+1)||dfs(i+1,j,k+1)||dfs(i,j-1,k+1)||dfs(i,j+1,k+1)){ return true; } //走到這,說明這一條路不通,還原,再試其餘的路徑 flag[index] = false; return false; } }