1. 程式人生 > 實用技巧 >若依前後端分離版手把手教你本地搭建環境並執行專案

若依前後端分離版手把手教你本地搭建環境並執行專案

題目描述:請設計一個函式,用來判斷在一個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意一個格子開始,每一步可以在矩陣中向左,向右,向上,向下移動一個格子。如果一條路徑經過了矩陣中的某一個格子,則該路徑不能再進入該格子。

例如:[ [a b c e]

[s f c s]

[a d e e] ]

矩陣中包含一條字串 “bcced”的路徑,但是矩陣中不包含 "abcb" 路徑,因為字串的第一個字元 b 佔據了矩陣中的第一行第二個格子之後,路徑不能再次進入該格子。

分析:在力扣上看到一個我可以理解的題解,但是還不會實現,先把思路放在這。

1. 既然要在矩陣中匹配一個單詞 word,那麼我們自然地想到,應該先遍歷矩陣找到單詞的開頭。

2. 找到開頭後,有必要深入下去嘗試匹配剩餘字元。

3. 深入匹配有 4 個方向可以選擇,只要有 1 個方向匹配成功了,就說明找到了;只有 4 個方向都無法匹配出 word,才說明這個開頭不合適,應該繼續遍歷矩陣找新的開頭。

4. 找到新的開頭,繼續重複以上匹配過程。

5. 由於匹配過程不能使用已經用過的字元,所以應當標記匹配過的字元。原始的想法是藉助一個和 board 同樣大小的矩陣 boolean[][] visit = new boolean[r][c],r 表示 board 的行數,c 表示 board 的列數;

但是我們可以通過巧妙的方法,避免這個空間開銷。具體方法是,如果我們已經訪問過這個字元,那麼先把這個字元賦值為一個矩陣中不可能存在的字元,比如 '#',就可以表示已訪問過了。當這條路走不通 了,恢復它本來的樣子就可以了。(當然必須說明,這種取巧方法是靠運氣的,因為題目並沒有說明矩陣中字元的種類,只是恰好用到了一個測試案例裡沒有的字元作為標記)為什麼要恢復本來的樣子?因 為當前路走不通,只是因為開頭不對。找到新的開頭後,以前舊的開頭訪問過的字元對於新開頭來說仍然是可以訪問的。比如說,在以下矩陣匹配 word = "aabc"。

word = "abc"

board = [
    [
'a', 'a'], ['c', 'b'] ] 第一次從(0,0)開始匹配,標記為已訪問 board = [ ['#', 'a'], ['c', 'b'] ] 由於4個方向都不能匹配完 word,因此從這個開頭出發是匹配不出 word 的,刪除標記,恢復本來的樣子 board = [ ['a', 'a'], ['c', 'b'] ] 第二次從(0,1)開始匹配,是可以匹配出 "aacb" 的:(0,1) -> (0,0) -> (1,0) -> (1,1) 如果第一次匹配沒有撤銷標記,那麼(0,0)位置上是'#'是不可走的,這將導致第二次匹配失敗,而理應是成功的
 1 public class Solution {
 2     public boolean hasPath(char[] matrix, int rows, int cols, char[] str){
 3         int[] flag = new int[rows * cols];
 4         for(int i = 0; i < rows; i++) {
 5             for(int j = 0; j < cols; j++) {
 6                 if(help(matrix, rows, cols, str, 0, flag, i, j)) {
 7                     return true;
 8                 }
 9             }
10         }
11             
12         return false;
13     }
14     public boolean help(char[] matrix, int rows, int cols, char[] str, int cur, int[] flag, int r, int c){
15         // int row, int col 表明當前的座標的行列值
16         // flag 表明那些曾經在路徑中出現過的節點的座標
17         // cur 表示當前需要匹配的字元的位置,是下一個待訪問的節點,不需關係其有效性,因為最後一個元素是‘、0’
18         int index = cols * r + c;
19         if (r >= 0 && r < rows && c >= 0 && c < cols && flag[index] == 0) {
20             if (matrix[index] == str[cur]) {
21                 cur = cur + 1;
22                 if (cur >= str.length) return true;
23                     flag[index] = 1;
24                     if (help(matrix, rows, cols, str, cur, flag, r - 1, c) ||
25                             help(matrix, rows, cols, str, cur, flag, r + 1, c) ||
26                             help(matrix, rows, cols, str, cur, flag, r, c - 1) ||
27                             help(matrix, rows, cols, str, cur, flag, r, c + 1))
28                         return true;
29                     flag[index] = 0;
30                     return false;
31                 }
32                 return false;
33             }
34             return false;
35         }
36 }