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是不是需要添加