- 题目描述
给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
提示:
board 和 word 中只包含大写和小写英文字母。
1 <= board.length <= 200
1 <= board[i].length <= 200
1 <= word.length <= 10^3
- 示例
- 示例:
board =
[
[‘A’,‘B’,‘C’,‘E’],
[‘S’,‘F’,‘C’,‘S’],
[‘A’,‘D’,‘E’,‘E’]
]
给定 word = “ABCCED”, 返回 true
给定 word = “SEE”, 返回 true
给定 word = “ABCB”, 返回 false
- 思路分析
深度优先搜索。找到一个符合的字符,就依次检查上下左右的元素是否也符合。
- JAVA实现
class Solution {
public boolean exist(char[][] board, String word) {
int rows = board.length;
int columns = board[0].length;
boolean find = false;
int[][] used = new int[rows][columns]; //判断这个位子是否已经用过了
for(int i=0; i<rows; i++) {
for(int j=0; j<columns; j++) used[i][j] = 0;
}
for(int i=0; i<rows; i++) {
for(int j=0; j<columns; j++) {
if(board[i][j]==word.charAt(0)) {
used[i][j] = 1;
find = findNei(board, used, word, i, j, 1);
if(find == true) return find;
used[i][j] = 0; //这里也要变回0,容易忘记
}
}
}
return find;
}
public boolean findNei(char[][] board, int[][] used, String word, int i, int j, int pos) { //pos是需要匹配的字符位置
if(pos == word.length()) return true; //说明已经找到匹配了
//检查上下左右的元素
boolean find_up = false, find_bt = false, find_left = false, find_right = false;
if(i>0 && board[i-1][j] == word.charAt(pos) && used[i-1][j] == 0) { //检查上面的元素,必须满足三个条件:
//1. 存在上面的元素
//2. 上面的元素可以匹配这个字符
//3. 上面的元素没有被使用过
used[i-1][j] = 1;
find_up = findNei(board, used, word, i-1, j, pos+1);
used[i-1][j] = 0;
}
if(find_up == true) return true; //降低运行时间,如果没有符合的,再找其他方向
if(i<board.length-1 && board[i+1][j] == word.charAt(pos) && used[i+1][j] == 0 ) { //检查下面的元素
used[i+1][j] = 1;
find_bt = findNei(board, used, word, i+1, j, pos+1);
used[i+1][j] = 0;
}
if(find_bt == true) return true;
if(j>0 && board[i][j-1] == word.charAt(pos) && used[i][j-1] == 0) { //检查左边的元素
used[i][j-1] = 1;
find_left = findNei(board, used, word, i, j-1, pos+1);
used[i][j-1] = 0;
}
if(find_left == true) return true;
if(j<board[0].length-1 && board[i][j+1] == word.charAt(pos) && used[i][j+1] == 0) { //检查右边的元素
used[i][j+1] = 1;
find_right = findNei(board, used, word, i, j+1, pos+1);
used[i][j+1] = 0;
}
if(find_right == true) return true;
return false;
}
}