菜雞每日一題系列打卡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)。
執行結果
學習 | 工作 | 分享
????長按關注“有理想的菜雞”
只有你想不到,沒有你學不到