给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-search
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
private boolean[][] marked;
private int m;
private int n;
public boolean exist(char[][] board, String word) {
int length=0;
m=board.length;
char[] wordArr=word.toCharArray();
if(m==0){
if(word.length()!=0){
return false;
}else {
return true;
}
}
n=board[0].length;
marked = new boolean[m][n];
for (int i=0;i<m;i++){
for (int j=0;j<n;j++){
if(existWord(board,wordArr,i,j,0)){
return true;
}
}
}
return false;
}
private boolean existWord(char[][] board,char[] wordArr,int row,int col,int length){
if(length==wordArr.length){
return true;
}else {
if(board[row][col]==wordArr[length]){
marked[row][col] = true;
length++;
if(length==wordArr.length){
return true;
}
if(inArea(row-1, col)&&!marked[row-1][col]){
if(existWord(board, wordArr, row-1, col, length)){
return true;
}
}
if(inArea(row+1, col)&&!marked[row+1][col]){
if(existWord(board, wordArr, row+1, col, length)){
return true;
}
}
if(inArea(row, col-1)&&!marked[row][col-1]){
if(existWord(board, wordArr, row, col-1, length)){
return true;
}
}
if(inArea(row, col+1)&&!marked[row][col+1]){
if(existWord(board, wordArr, row, col+1, length)){
return true;
}
}
marked[row][col] = false;
}
return false;
}
}
private boolean inArea(int x, int y) {
return x >= 0 && x < m && y >= 0 && y < n;
}
}