题目
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.
解题
- 递归 + 回溯
- 深度优先搜索
class Solution {
private int[][] move = {{0, 1}, {1,0}, {0, -1}, {-1, 0}};
public boolean exist(char[][] board, String word) {
if (board == null) {
return false;
}
char[] words = word.toCharArray();
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[i].length; j++) {
if (find(board, i, j, words, 0)) {
return true;
}
}
}
return false;
}
// 从board[row][col]开始寻找word的[index...word.length]部分
private boolean find(char[][] board, int row, int col, char[] word, int index){
if (index == word.length) {
return true;
}
if (row >= board.length || col >= board[0].length || row < 0 || col < 0 || board[row][col] != word[index]) {
return false;
}
char temp = board[row][col];
// 将当前元素置为0, 表示当前元素已被使用过, 避免重复匹配
board[row][col] = '0';
boolean exist = find(board, row + move[0][0], col + move[0][1], word, index + 1)
|| find(board, row + move[1][0], col + move[1][1], word, index + 1)
|| find(board, row + move[2][0], col + move[2][1], word, index + 1)
|| find(board, row + move[3][0], col + move[3][1], word, index + 1);
// 回溯
board[row][col] = temp;
return exist;
}
}