給定 m×n 字符網格 board 和字符串 word,判斷 word 是否能由**相鄰單元格**(上下左右)順序構成,每個單元格最多使用一次。
從每個格子作為起點嘗試匹配:
visited[i][j] = trueword 最後一字符 → truevisited[i][j] = false,返回 false
class Solution {
public boolean exist(char[][] board, String word) {
if (board == null || board.length == 0) return false;
int m = board.length, n = board[0].length;
boolean[][] visited = new boolean[m][n];
for (int i = 0; i < m; ++i)
for (int j = 0; j < n; ++j)
if (dfs(board, visited, word, 0, i, j))
return true;
return false;
}
private boolean dfs(char[][] board, boolean[][] visited,
String word, int idx, int i, int j) {
if (i < 0 || i >= board.length || j < 0 || j >= board[0].length) return false;
if (visited[i][j] || board[i][j] != word.charAt(idx)) return false;
visited[i][j] = true;
if (idx == word.length() - 1) return true;
if (dfs(board, visited, word, idx+1, i, j+1) ||
dfs(board, visited, word, idx+1, i+1, j) ||
dfs(board, visited, word, idx+1, i-1, j) ||
dfs(board, visited, word, idx+1, i, j-1))
return true;
visited[i][j] = false;
return false;
}
}
#)標記訪問,省去 visited 陣列(需確保 board 字符集不含該字符)