题目地址
https://leetcode-cn.com/problems/word-search/
题目描述
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
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
题解
回溯算法
class Solution {
public boolean exist(char[][] board, String word) {
boolean[][]used = new boolean[board.length][board[0].length];
// 枚举每一个点 [i, j]
// 表示从这个点开始是否可以找到一个匹配的单词
for (int i = 0; i < board.length; ++ i) {
for (int j = 0; j < board[0].length; ++ j) {
if (dfs(board, word, i, j, 0, used)) {
return true;
}
}
}
return false;
}
public boolean dfs(char[][] board, String word, int row, int column, int wordIndex, boolean[][] used) {
// 超出 board 界限
if (row < 0 || row >= board.length
|| column < 0 || column >= board[0].length) {
return false;
}
// 排除已经走过的位置
if (used[row][column]) {
return false;
}
if (board[row][column] != word.charAt(wordIndex)) {
return false;
}
// 已经走到了终点
if (wordIndex == word.length() - 1) {
return true;
}
// 做选择
used[row][column] = true;
boolean result =
dfs(board, word, row+1, column, wordIndex+1, used) // 向下走一步
|| dfs(board, word, row-1, column, wordIndex+1, used) // 向上走一步
|| dfs(board, word, row, column+1, wordIndex+1, used) // 向右走一步
|| dfs(board, word, row, column-1, wordIndex+1, used); // 向左走一步
// 撤销选择
used[row][column] = false;
return result;
}
}
网友评论