给出一个二维的字母板和一个单词,寻找字母板网格中是否存在这个单词。
单词可以由按顺序的相邻单元的字母组成,其中相邻单元指的是水平或者垂直方向相邻。每个单元中的字母最多只能使用一次。
样例
给出board =
[
"ABCE",
"SFCS",
"ADEE"
]
word = "ABCCED", ->返回 true,
word = "SEE",-> 返回 true,
word = "ABCB", -> 返回 false.
来源: 单词搜索
本题就是一个很简单的暴力搜索,遍历矩阵,找到一个字母和目标单词首字母相同,那么就由此点开始向四周搜寻是否存在路径可以使得字母组成该单词。注意的是,每次搜完一个词要把这个词给变成#, 避免回路发生。并且在下一次新的搜寻开始前把这个# 恢复
class Solution {
int[] moveX = {0,0,1,-1};
int[] moveY = {1,-1,0,0};
boolean res = false;
public boolean exist(char[][] board, String word) {
if(board == null || board.length == 0 || board[0].length == 0){
return false;
}
int m = board.length;
int n = board[0].length;
for(int i = 0;i < m; i++){
for(int j = 0; j < n; j++){
if(board[i][j] == word.charAt(0)){
board[i][j] = '#';
res = dfs(board, i, j, 1, word);
board[i][j] = word.charAt(0);
if(res == true){
return res;
}
}
}
}
return res;
}
private boolean dfs(char[][] board, int x, int y, int start, String word){
if(start == word.length()){
return true;
}
boolean res = false;
for(int i = 0; i < 4; i++){
int nx = x + moveX[i];
int ny = y + moveY[i];
if(!isValid(board, nx, ny, word.charAt(start))){
continue;
}
board[nx][ny] = '#';
res = dfs(board, nx,ny,start+1, word);
if(res == true){
return res;
}
board[nx][ny] = word.charAt(start);
}
return res;
}
private boolean isValid(char[][] board, int i, int j, char c){
if(i >= 0 && i < board.length
&& j >= 0 && j < board[0].length
&& board[i][j] == c){
return true;
}
return false;
}
}