[劍指 offer]12 矩陣中的路徑 Java實現
阿新 • • 發佈:2020-12-08
題目
劍指 Offer 12. 矩陣中的路徑
請設計一個函式,用來判斷在一個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意一格開始,每一步可以在矩陣中向左、右、上、下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑不能再次進入該格子。例如,在下面的3×4的矩陣中包含一條字串“bfce”的路徑(路徑中的字母用加粗標出)。
[[“a”,“b”,“c”,“e”],
[“s”,“f”,“c”,“s”],
[“a”,“d”,“e”,“e”]]
但矩陣中不包含字串“abfb”的路徑,因為字串的第一個字元b佔據了矩陣中的第一行第二個格子之後,路徑不能再次進入這個格子。
示例 1:
輸入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”
輸出:true
示例 2:
輸入:board = [[“a”,“b”],[“c”,“d”]], word = “abcd”
輸出:false
提示:
1 <= board.length <= 200
1 <= board[i].length <= 200
程式碼
這道題用的其實是我最不擅長的遞迴…
不僅是用法不擅長 算這種演算法的時間複雜度也不擅長(扶額
主要是boolean flag那一行的程式碼時間複雜度不知道該如何處理
但結果是O(3^K m*n)…
class Solution {
public boolean exist(char[][] board, String word) {
char[] words = word.toCharArray();
for (int x = 0; x < board.length; x++) {
for (int y = 0; y < board[0].length; y++) {
if (start(words, word. length(), board, x, y, 0)) {
return true;
}
}
}
return false;
}
public static boolean start(char[] words, int length, char[][] board, int x, int y, int n) {
if (x >= board.length || x < 0 || y >= board[0].length || y < 0 || board[x][y] != words[n]) {
return false;
}
//不越界 相等 就進行下一步
if (n == length - 1) {
return true;
}
//長度到了就返回true唄~
board[x][y] = '#';
//如果字元可能出現#的話就不能用#了
//這個是防止走回頭路
boolean flag = start(words, length, board, x + 1, y, n + 1) || start(words, length, board, x - 1, y, n + 1) ||
start(words, length, board, x, y + 1, n + 1) || start(words, length, board, x, y - 1, n + 1);
//遞迴的精髓(不是
//上下左右全給你來一遍
board[x][y] = words[n];
return flag;
}
}