给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board = [ ['A','B','C','E'], ['S','F','C','S'], ['A','D','E','E'] ] 给定 word = "ABCCED", 返回 true. 给定 word = "SEE", 返回 true. 给定 word = "ABCB", 返回 false.
class Solution {
char[][] map;
int[][] invested;
public boolean exist(char[][] board, String word) {
map = board;
if(map.length == 0){
if(word == ""){
return true;
}else{
return false;
}
}else{
for(int i=0; i<map.length; i++){
for(int j=0; j<map[0].length; j++){
invested = new int[map.length][map[0].length];
if(map[i][j] == word.charAt(0)){
if(dfs(i, j, word)){
return true;
}
}
}
}
return false;
}
}
// DFS寻找下一个字母并且递归
public boolean dfs(int y, int x, String word){
if(Inrange(y, x) == false || word.length() == 0 || invested[y][x] == 1){
return false;
}else if(word.length() == 1){
if(word.charAt(0) == map[y][x] && invested[y][x] == 0){
return true;
}
return false;
}else{
if(map[y][x] == word.charAt(0)){
invested[y][x] = 1;
if(dfs(y-1, x, word.substring(1))){
invested[y][x] = 0;
return true;
}else if(dfs(y+1, x, word.substring(1))){
invested[y][x] = 0;
return true;
}else if(dfs(y, x-1, word.substring(1))){
invested[y][x] = 0;
return true;
}else if(dfs(y, x+1, word.substring(1))){
invested[y][x] = 0;
return true;
}else{
invested[y][x] = 0;
return false;
}
}else{
return false;
}
}
}
// 判断当前搜索的点是否在范围内
public boolean Inrange(int y, int x){
if(y < 0 || y >= map.length || x < 0 || x >= map[0].length){
return false;
}else{
return true;
}
}
}