79. Word Search

把表看成是一棵以左上角为root的树,进行dfs,用used存放访问是否

 1     public boolean exist(char[][] board, String word) {
 2         if(word == null || word.length() == 0) {
 3             return true;
 4         }
 5         if(board == null || board.length == 0 ||  board[0].length == 0) {
 6             return false;
 7         }
 8         boolean[][] used = new boolean[board.length][board[0].length];
 9         for(int row = 0; row < board.length; row++) {
10             for(int col = 0; col < board[0].length; col++) {
11                 if(search(board, word, 0, used, row, col)) {
12                     return true;
13                 }
14             }
15         }
16         return false;
17     }
18     
19     private boolean search(char[][] board, String word, int index, boolean[][] used, int row, int col) {
20         if(index == word.length()) { 
21             return true;
22         }
23         int rowNum = board.length;
24         int colNum = board[0].length;
25         if(row >= rowNum || col >= colNum || row < 0 || col < 0 || used[row][col] || board[row][col] != word.charAt(index)) {
26             return false;
27         }
28         used[row][col] = true;
29         if(search(board, word, index+1, used, row+1, col) || search(board, word, index+1, used, row-1, col) 
30                 || search(board, word, index+1, used, row, col+1) || search(board, word, index+1, used, row, col-1)) {
31             return true;
32         }
33         used[row][col] = false;
34         return false;
35     }

要注意下标从0开始

1.20行index == word.length().就是说已经搜索的超过这个word的范围了,所以为真。如果index == word.length()-1,那么最后一位其实还没有搜

2.25行,col>=colNum,不是>

 

=-------

update:这种几个方向走的板子要注意的几个:

1.不要忘了判断下一个位置是不是在还在板子的坐标范围内

2.注意退出的条件,因为超过板子的地方从一开始就不会进入递归,所以最后一位的时候就要判断,不能留到刚好超过的地方再判断

3.注意boolean[][] visited是不是需要添加

posted @ 2016-03-31 08:55  warmland  阅读(154)  评论(0编辑  收藏  举报