JZ12 矩陣中的路徑 描述 請設計一個函數,用來判斷在一個n乘m的矩陣中是否存在一條包含某長度為len的字元串所有字元的路徑。路徑可以從矩陣中的任意一個格子開始,每一步可以在矩陣中向左,向右,向上,向下移動一個格子。如果一條路徑經過了矩陣中的某一個格子,則該路徑不能再進入該格子。 思路 我們看到他 ...
JZ12 矩陣中的路徑
描述
請設計一個函數,用來判斷在一個n乘m的矩陣中是否存在一條包含某長度為len的字元串所有字元的路徑。路徑可以從矩陣中的任意一個格子開始,每一步可以在矩陣中向左,向右,向上,向下移動一個格子。如果一條路徑經過了矩陣中的某一個格子,則該路徑不能再進入該格子。
思路
我們看到他是從矩形中的一個點開始往他的上下左右四個方向查找,這個點可以是矩形中的任何一個點,所以代碼的大致輪廓我們應該能寫出來,就是遍歷矩形所有的點,然後從這個點開始往他的4個方向走,因為是二維數組,所以有兩個for迴圈,代碼如下
public boolean hasPath (char[][] matrix, String word) {
char[] words = word.toCharArray();
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
//從[i,j]這個坐標開始查找
if (dfs(matrix, words, i, j, 0))
return true;
}
}
return false;
}
這裡關鍵代碼是dfs這個函數,因為每一個點我們都可以往他的4個方向查找,所以我們可以把它想象為一棵4叉樹,就是每個節點有4個子節點,而樹的遍歷我們最容易想到的就是遞歸,我們來大概看一下
boolean dfs(char[][] board, char[] word, int i, int j, int index) {
if (邊界條件的判斷) {
return;
}
一些邏輯處理
boolean res;
//往右
res = dfs(board, word, i + 1, j, index + 1)
//往左
res |= dfs(board, word, i - 1, j, index + 1)
//往下
res |= dfs(board, word, i, j + 1, index + 1)
//往上
res |= dfs(board, word, i, j - 1, index + 1)
//上面4個方向,只要有一個能查找到,就返回true;
return res;
}
代碼
package mid.JZ12矩陣中的路徑;
import java.util.*;
public class Solution {
/**
* 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可
*
*
* @param matrix char字元型二維數組
* @param word string字元串
* @return bool布爾型
*/
public boolean hasPath (char[][] matrix, String word) {
// write code here
char[] words = word.toCharArray();
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if (dfs(matrix, words, i, j, 0)) {
return true;
}
}
}
return false;
}
public boolean dfs(char[][] matrix,char[] word, int i, int j, int index) {
//行
int n = matrix.length;
//列
int m = matrix[0].length;
if (i >= n || i < 0 || j >= m || j < 0 || matrix[i][j] != word[index]) {
return false;
}
if (index == word.length - 1) return true;
//記錄當前坐標的值保存下來,防止重覆使用
char tmp = matrix[i][j];
matrix[i][j] = '.';
//走遞歸
boolean res = (dfs(matrix, word, i + 1, j, index + 1) ||
dfs(matrix, word, i, j + 1, index + 1) ||
dfs(matrix, word, i - 1, j, index + 1) ||
dfs(matrix, word, i, j - 1, index + 1));
//當前值複原
matrix[i][j] = tmp;
return res;
}
}