回溯法

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

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

示例:

board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]

给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.

 

解答:

 1 public class Solution {
 2 
 3     public static boolean exist(char[][] board, String word) {
 4         if(word.length() > board.length*board[0].length()) {
 5             return false;
 6         }
 7 
 8         boolean[][] boardFlag = new boolean[board.length][board[0].length];
 9         for(int i = 0; i < board.length; i++) {
10             for(int j = 0; j < board[0].length; j++) {
11                 if(find(i, j, board, word, boardFlag)) {
12                     return true;
13                 }
14             }
15         }
16 
17         return false;
18     }
19 
20     public static boolean find(int i, int j, char[][] board, String word, boolean[][] boardFlag) {
21         if(board[i][j] == word.charAt(0) && !boardFlag[i][j]) {
22 
23             boardFlag[i][j] = true;
24 
25             if(word.length-1 == 0) {
26                 return true;
27             }
28 
29             if(j + 1 < board[0].length) {
30                 if(find(i,j+1,board,word.substring(1,word.length()),boardFlag)) return true;
31             }
32 
33             if(j - 1 >= 0) {
34                 if(find(i,j-1,board,word.substring(1,word.length()),boardFlag)) return true;
35             }
36 
37             if (i+1 < board.length) {
38                 if(find(i+1,j,board,word.substring(1,word.length()),boardFlag)) return true;  
39             }
40                 
41             if (i-1 >= 0) {
42                 if(find(i-1,j,board,word.substring(1,word.length()),boardFlag)) return true;  
43             }
44 
45             // important here
46             boardFlag[i][j] = false;
47 
48             return false;
49         }
50     }
51 }

 

 

posted @ 2019-03-03 18:18  林木声  阅读(238)  评论(0编辑  收藏  举报