每日一題——單詞搜索

菜雞每日一題系列打卡79

每天一道算法題目 

小夥伴們一起留言打卡

堅持就是勝利,我們一起努力!

題目描述(引自LeetCode)

給定一個二維網格和一個單詞,找出該單詞是否存在於網格中。

單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重複使用。

示例:
board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]


給定 word = "ABCCED", 返回 true
給定 word = "SEE", 返回 true
給定 word = "ABCB", 返回 false

提示:

  • board 和 word 中只包含大寫和小寫英文字母。

  • 1 <= board.length <= 200

  • 1 <= board[i].length <= 200

  • 1 <= word.length <= 10^3

題目分析

這道單詞搜索的題目,實質上是一道圖的遍歷的變形題目,對於題目尋找指定單詞的要求,我們可以採用DFS進行實現。DFS的算法實際上採用的是我們的老朋友——回溯的思想。話不多說,上代碼!

代碼實現

public class Solution {


    private int[][] direction = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}};
    private boolean[][] visited;
    private int row;
    private int column;


    public boolean exist(char[][] board, String word) {
        if (board == null || board.length == 0) return false;
        row = board.length;
        column = board[0].length;
        visited = new boolean[row][column];
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < column; j++) {
                if (dfs(i, j, 0, board, word)) return true;
            }
        }
        return false;
    }


    private boolean dfs(int x, int y, int current, char[][]board, String word) {
        if (current == word.length() - 1) return board[x][y] == word.charAt(current);
        if (board[x][y] == word.charAt(current)) {
            visited[x][y] = true;
            for (int[] array : direction) {
                int tmpX = x + array[0], tmpY = y + array[1];
                if (check(tmpX, tmpY) && !visited[tmpX][tmpY]) {
                    if (dfs(tmpX, tmpY, current + 1, board, word)) return true;
                }
            }
            visited[x][y] = false;
        }
        return false;
    }


    private boolean check(int x, int y) {
        return x >= 0 && x < row && y >= 0 && y < column;
    }
}

代碼分析

對代碼進行分析,程序採用了回溯法,其在最壞情況下的時間複雜度是指數級別的;而就空間而言,採用了m * n大小的狀態數組來記錄訪問情況,因此,空間複雜度爲O(mn)。

執行結果

學習 | 工作 | 分享

????長按關注“有理想的菜雞

只有你想不到,沒有你學不到

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章