題目:
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
.
題解:
這道題分析看,就是一個詞,在一行出現也是true,一列出現也是true,一行往下拐彎也是true,一行往上拐彎也是true,一列往左拐彎也是true,一列往右拐彎也是true。所以是要考慮到所有可能性,基本思路是使用DFS來對一個起點字母上下左右搜尋,看是不是含有給定的Word。還要維護一個visited陣列,表示從當前這個元素是否已經被訪問過了,過了這一輪visited要回false,因為對於下一個元素,當前這個元素也應該是可以被訪問的。
程式碼如下:
1 public boolean exist(char[][] board, String word) {
2 int m = board.length;
3 int n = board[0].length;
4 boolean[][] visited = new boolean[m][n];
5 for (int i = 0; i < m; i++) {
6 for (int j = 0; j < n; j++) {
7 if (dfs(board, word, 0, i, j, visited))
8 return true;
9 }
10 }
11 return false;
12 }
13
14 public boolean dfs(char[][] board, String word, int index, int rowindex, int colindex, boolean[][] visited) {
15 if (index == word.length())
16 return true;
17 if (rowindex < 0 || colindex < 0 || rowindex >=board.length || colindex >= board[0].length)
18 return false;
19 if (visited[rowindex][colindex])
20 return false;
21 if (board[rowindex][colindex] != word.charAt(index))
22 return false;
23 visited[rowindex][colindex] = true;
24 boolean res = dfs(board, word, index + 1, rowindex - 1, colindex,
25 visited)
26 || dfs(board, word, index + 1, rowindex + 1, colindex, visited)
27 || dfs(board, word, index + 1, rowindex, colindex + 1, visited)
28 || dfs(board, word, index + 1, rowindex, colindex - 1, visited);
29 visited[rowindex][colindex] = false;
30 return res;
31 }
2 int m = board.length;
3 int n = board[0].length;
4 boolean[][] visited = new boolean[m][n];
5 for (int i = 0; i < m; i++) {
6 for (int j = 0; j < n; j++) {
7 if (dfs(board, word, 0, i, j, visited))
8 return true;
9 }
10 }
11 return false;
12 }
13
14 public boolean dfs(char[][] board, String word, int index, int rowindex, int colindex, boolean[][] visited) {
15 if (index == word.length())
16 return true;
17 if (rowindex < 0 || colindex < 0 || rowindex >=board.length || colindex >= board[0].length)
18 return false;
19 if (visited[rowindex][colindex])
20 return false;
21 if (board[rowindex][colindex] != word.charAt(index))
22 return false;
23 visited[rowindex][colindex] = true;
24 boolean res = dfs(board, word, index + 1, rowindex - 1, colindex,
25 visited)
26 || dfs(board, word, index + 1, rowindex + 1, colindex, visited)
27 || dfs(board, word, index + 1, rowindex, colindex + 1, visited)
28 || dfs(board, word, index + 1, rowindex, colindex - 1, visited);
29 visited[rowindex][colindex] = false;
30 return res;
31 }
Reference:http://blog.csdn.net/yiding_he/article/details/18893621