1. 程式人生 > 其它 >[劍指 offer]12 矩陣中的路徑 Java實現

[劍指 offer]12 矩陣中的路徑 Java實現

技術標籤:劍指offerleetcodejava演算法

在這裡插入圖片描述

題目

劍指 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那一行的程式碼時間複雜度不知道該如何處理

前面mn倒是很清楚 起初我以為會是O(mn)
但結果是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; } }