給定 m x n 字符矩陣 board 和字符串 word,判斷 word 是否能由矩陣中相鄰單元格(上下左右)順序構成。同一單元格不可重複使用。
範例:
board = [["A","B","C","E"],
["S","F","C","S"],
["A","D","E","E"]]
word = "ABCCED" → true
word = "SEE" → true
word = "ABCB" → false
從每個單元格作為起點嘗試 DFS:
visited 數組防止重複使用class Solution {
public:
bool exist(vector>& board, string word) {
int m = board.size(), n = board[0].size();
vector> visited(m, vector(n, false));
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:
bool dfs(vector>& board, vector>& visited,
const string& word, int idx, int x, int y) {
if (idx == word.size()) return true; // 完全匹配
if (x < 0 || x >= board.size() || y < 0 || y >= board[0].size()) return false;
if (visited[x][y]) return false;
if (board[x][y] != word[idx]) return false;
visited[x][y] = true;
bool found = dfs(board, visited, word, idx+1, x+1, y) ||
dfs(board, visited, word, idx+1, x-1, y) ||
dfs(board, visited, word, idx+1, x, y+1) ||
dfs(board, visited, word, idx+1, x, y-1);
visited[x][y] = false; // 回溯
return found;
}
};
不額外分配 visited,直接修改 board[x][y] 為特殊字符(如 '#'),回溯時恢復。
bool dfs(vector>& board, const string& word, int idx, int x, int y) { if (idx == word.size()) return true; if (x < 0 || x >= board.size() || y < 0 || y >= board[0].size()) return false; if (board[x][y] != word[idx]) return false; char tmp = board[x][y]; board[x][y] = '#'; // 標記已訪問 bool found = dfs(board, word, idx+1, x+1, y) || dfs(board, word, idx+1, x-1, y) || dfs(board, word, idx+1, x, y+1) || dfs(board, word, idx+1, x, y-1); board[x][y] = tmp; // 恢復 return found; }
| 指標 | 複雜度 | 說明 |
|---|---|---|
| 時間 | O(mn · 4^L) | L 為 word 長度,最壞情況每格 4 向擴展 |
| 空間 | O(L) | 遞歸棧深度,原地標記版 O(1) 額外空間 |
