|
33 | 33 |
|
34 | 34 | ## 解法
|
35 | 35 |
|
| 36 | +深度优先搜索 DFS 解决。 |
| 37 | + |
36 | 38 | <!-- tabs:start -->
|
37 | 39 |
|
38 | 40 | ### **Python3**
|
39 | 41 |
|
40 | 42 | ```python
|
41 | 43 | class Solution:
|
42 | 44 | def exist(self, board: List[List[str]], word: str) -> bool:
|
43 |
| - if not word: |
44 |
| - return False |
45 |
| - rows, cols = len(board), len(board[0]) |
46 |
| - visited = [[False for _ in range(cols)] for _ in range(rows)] |
47 |
| - for i in range(rows): |
48 |
| - for j in range(cols): |
49 |
| - if self.visit(board, visited, i, j, rows, cols, word): |
| 45 | + def dfs(i, j, cur): |
| 46 | + if cur == len(word): |
| 47 | + return True |
| 48 | + if i < 0 or i >= m or j < 0 or j >= n or visited[i][j] or word[cur] != board[i][j]: |
| 49 | + return False |
| 50 | + visited[i][j] = True |
| 51 | + next = cur + 1 |
| 52 | + res = dfs(i + 1, j, next) or dfs(i - 1, j, next) or dfs(i, j + 1, next) or dfs(i, j - 1, next) |
| 53 | + visited[i][j] = False |
| 54 | + return res |
| 55 | + m, n = len(board), len(board[0]) |
| 56 | + visited = [[False for _ in range(n)] for _ in range(m)] |
| 57 | + for i in range(m): |
| 58 | + for j in range(n): |
| 59 | + res = dfs(i, j, 0) |
| 60 | + if res: |
50 | 61 | return True
|
51 | 62 | return False
|
52 |
| - |
53 |
| - def visit(self, board, visited, i, j, rows, cols, word) -> bool: |
54 |
| - if not word: |
55 |
| - return True |
56 |
| - if i < 0 or j < 0 or i >= rows or j >= cols or visited[i][j] or board[i][j] != word[0]: |
57 |
| - return False |
58 |
| - visited[i][j] = True |
59 |
| - res = self.visit(board, visited, i - 1, j, rows, cols, word[1:]) or self.visit(board, visited, i + 1, j, rows, cols, word[1:]) or self.visit(board, visited, i, j - 1, rows, cols, word[1:]) or self.visit(board, visited, i, j + 1, rows, cols, word[1:]) |
60 |
| - visited[i][j] = res |
61 |
| - return res |
62 | 63 | ```
|
63 | 64 |
|
64 | 65 | ### **Java**
|
65 | 66 |
|
66 | 67 | ```java
|
67 | 68 | class Solution {
|
| 69 | + private boolean[][] visited; |
| 70 | + |
68 | 71 | public boolean exist(char[][] board, String word) {
|
69 |
| - if (word == null || word.length() == 0) { |
70 |
| - return false; |
71 |
| - } |
72 |
| - int rows = board.length, cols = board[0].length; |
73 |
| - boolean[][] visited = new boolean[rows][cols]; |
74 |
| - for (int i = 0; i < rows; ++i) { |
75 |
| - for (int j = 0; j < cols; ++j) { |
76 |
| - if (visit(board, visited, i, j, rows, cols, word)) { |
77 |
| - return true; |
78 |
| - } |
| 72 | + int m = board.length, n = board[0].length; |
| 73 | + visited = new boolean[m][n]; |
| 74 | + char[] chars = word.toCharArray(); |
| 75 | + for (int i = 0; i < m; ++i) { |
| 76 | + for (int j = 0; j < n; ++j) { |
| 77 | + boolean res = dfs(board, i, j, chars, 0); |
| 78 | + if (res) return true; |
79 | 79 | }
|
80 | 80 | }
|
81 | 81 | return false;
|
82 | 82 | }
|
83 | 83 |
|
84 |
| - private boolean visit(char[][] board, boolean[][] visited, int i, int j, int rows, int cols, String word) { |
85 |
| - if (word.length() == 0) { |
86 |
| - return true; |
87 |
| - } |
88 |
| - if (i < 0 || j < 0 || i >= rows || j >= cols || visited[i][j] || board[i][j] != word.charAt(0)) { |
89 |
| - return false; |
90 |
| - } |
91 |
| - |
| 84 | + private boolean dfs(char[][] board, int i, int j, char[] chars, int cur) { |
| 85 | + if (cur == chars.length) return true; |
| 86 | + if (i < 0 || i >= board.length || j < 0 || j >= board[0].length) return false; |
| 87 | + if (visited[i][j] || board[i][j] != chars[cur]) return false; |
92 | 88 | visited[i][j] = true;
|
93 |
| - String sub = word.substring(1); |
94 |
| - boolean res = visit(board, visited, i + 1, j, rows, cols, sub) |
95 |
| - || visit(board, visited, i - 1, j, rows, cols, sub) |
96 |
| - || visit(board, visited, i, j + 1, rows, cols, sub) |
97 |
| - || visit(board, visited, i, j - 1, rows, cols, sub); |
98 |
| - visited[i][j] = res; |
| 89 | + int next = cur + 1; |
| 90 | + boolean res = dfs(board, i + 1, j, chars, next) |
| 91 | + || dfs(board, i - 1, j, chars, next) |
| 92 | + || dfs(board, i, j + 1, chars, next) |
| 93 | + || dfs(board, i, j - 1, chars, next); |
| 94 | + visited[i][j] = false; |
99 | 95 | return res;
|
100 |
| - |
101 | 96 | }
|
102 | 97 | }
|
103 | 98 | ```
|
|
0 commit comments