leetcode79

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:

1
2
3
4
5
6
7
8
9
10
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]

给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class Solution {

static int[] row = {0,1,0,-1};
static int[] column = {1,0,-1,0};

public boolean exist(char[][] board, String word) {

for (int i =0,rowLen = board.length;i<rowLen;i++){
for (int j=0,columnLen = board[0].length;j<columnLen;j++){
if (dfs(board,word,i,j,0)) return true;
}
}
return false;
}

public boolean dfs(char[][] board,String word,int x,int y,int index){
if (x<0 || x>=board.length || y<0 || y>=board[0].length) return false;

if(board[x][y] != word.charAt(index)) return false;

if(index == word.length() - 1) return true;

board[x][y] = '#';

for (int i = 0 ; i<4;i++){
if (dfs(board,word,x+row[i],y+column[i],index+1)) return true;
}
board[x][y] = word.charAt(index);
return false;
}


public static void main(String[] args) {

char[][] borad = {{'F','Y','C','E','N','R','D'},{'K','L','N','F','I','N','U'},{'A','A','A','R','A','H','R'},{'N','D','K','L','P','N','E'},{'A','L','A','N','S','A','P'},{'O','O','G','O','T','P','N'},{'H','P','O','L','A','N','O'}};
String word= "poland";
System.out.println(new Solution().exist(borad,word));
}
}

这里主要说明一下

1
board[x][y] = '#';

是将已经查找过的做一个标记,以及

1
2
static int[] row = {0,1,0,-1};
static int[] column = {1,0,-1,0};

这段代码是指向四周遍历的坐标点。深度遍历的时候会经常用到,本道题用到了深度优先遍历和回溯。