Given a 2D board and a word, find if the word exists in the grid.
The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.
For example,
Given board =
[
["ABCE"],
["SFCS"],
["ADEE"]
]
word="ABCCED" ->returns true,
word="SEE"-> returns true,
word="ABCB" ->returns false.
分析:
从某点开始搜索,直到碰见满足条件的单词,这是典型的DFS应用,这里用另外一个矩阵存储已经访问的位置。
public class Solution {
public boolean exist(char[][] board, String word) {
if(word == null || word.length() == 0) return false;
for(int i=0; i<board.length; i++)
for(int j=0; j<board[0].length; j++){
//先找到开头位置
if(word.charAt(0) == board[i][j]){
if(word.length()==1)
return true;
else{
//mask来标记是否访问过
boolean[][] mask = new boolean[board.length][board[0].length];
mask[i][j] = true;
if(search(board, i, j, word.substring(1), mask))
return true;
}
}
}
return false;
}
public boolean search(char[][] board, int i, int j, String str, boolean[][] mask){
//每次去掉已经访问的字母,全部去掉的时候就说明找到了
if(str.length()==0) return true;
else{
//四个方向分别DFS
if(i>0&&(board[i-1][j]==str.charAt(0))&&(mask[i-1][j]==false)){
mask[i-1][j] = true;
if(search(board, i-1, j, str.substring(1), mask))
return true;
//DFS注意恢复现场
mask[i-1][j] = false;
}
if( (i<board.length-1)&&(board[i+1][j]==str.charAt(0))&&(mask[i+1][j]==false)){
mask[i+1][j] = true;
if(search(board, i+1, j, str.substring(1), mask))
return true;
mask[i+1][j] = false;
}
if( (j>0)&&(board[i][j-1]==str.charAt(0))&&(mask[i][j-1]==false)){
mask[i][j-1] = true;
if(search(board, i, j-1, str.substring(1), mask))
return true;
mask[i][j-1] = false;
}
if( (j<board[0].length-1)&&(board[i][j+1]==str.charAt(0))&&(mask[i][j+1]==false)){
mask[i][j+1] = true;
if(search(board, i, j+1, str.substring(1), mask))
return true;
mask[i][j+1] = false;
}
}
return false;
}
}