單詞搜尋
題目描述:給定一個 m x n 二維字元網格 board 和一個字串單詞 word 。如果 word 存在於網格中,返回 true ;否則,返回 false 。
單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重複使用。
示例說明請見LeetCode官網。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解法一:回溯演算法
首先,直接判斷2種特殊場景:
- 如果要匹配的字串為空,直接返回true;
- 如果board陣列為空,直接返回false。
否則,先宣告一個和board同樣大小的boolean型別的陣列,記錄當前單元格是否已經走過,然後遍歷board的每一個字元,對每一個字元和word第一個字元相等的時候,呼叫回溯方法進行判斷以當前字元為起點是否能夠匹配word字串,如果能返回true,否則繼續遍歷下一個字元。最後,如果沒有匹配成功,返回false。
public class LeetCode_079 {
public static boolean exist(char[][] board, String word) {
/**
* 如果要匹配的字串為空,直接返回true
*/
if (word == null || word.length() == 0) {
return true;
}
/**
* 如果board陣列為空,直接返回false
*/
if (board == null || board.length == 0 || board[0].length == 0) {
return false;
}
/**
* 宣告一個和board同樣大小的boolean型別的陣列,記錄當前單元格是否已經走過
*/
boolean[][] visited = new boolean[board.length][board[0].length];
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
/**
* 對每一個字元和word第一個字元相等的時候,呼叫方法進行判斷
*/
if (board[i][j] == word.charAt(0) && exist(board, visited, word, i, j, 0)) {
return true;
}
}
}
return false;
}
/**
* 回溯演算法
*
* @param board 原字元網格
* @param visited 和board大小相同的boolean型別的網格,標識當前字元是否走過
* @param word 要匹配的單詞
* @param startX 當前單元格的x座標
* @param startY 當前單元格的y座標
* @param pos 當前已經匹配了幾個字元
* @return
*/
private static boolean exist(char[][] board, boolean[][] visited, String word, int startX, int startY, int pos) {
if (board[startX][startY] != word.charAt(pos)) {
// 如果當前單元格和要匹配的字元不同,直接返回false
return false;
} else if (pos == word.length() - 1) {
// 如果已經匹配的字元數和word的長度相等,則說明已經匹配成功,返回true
return true;
}
visited[startX][startY] = true;
// 當前單元格可以往四個方向移動
int[][] directions = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
boolean result = false;
for (int[] dir : directions) {
int nextStartX = startX + dir[0], nextStartY = startY + dir[1];
if (nextStartX >= 0 && nextStartX < board.length && nextStartY >= 0 && nextStartY < board[0].length) {
if (!visited[nextStartX][nextStartY]) {
boolean flag = exist(board, visited, word, nextStartX, nextStartY, pos + 1);
if (flag) {
result = true;
break;
}
}
}
}
visited[startX][startY] = false;
return result;
}
public static void main(String[] args) {
char[][] board = new char[][]{{'A', 'B', 'C', 'E'}, {'S', 'F', 'C', 'S'}, {'A', 'D', 'E', 'E'}};
// 測試用例,期望返回: true
System.out.println(exist(board, "ABCCED"));
}
}
【每日寄語】 逆境、是非來臨,心中要持一“寬”字。