class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
if not board:
return False
# 深度优先搜索函数
def dfs(board, i, j, word, index):
# 判断当前位置是否越界或者字符是否不匹配
if i < 0 or i >= len(board) or j < 0 or j >= len(board[0]) or board[i][j] != word[index]:
return False
# 如果当前字符是单词的最后一个字符,则找到匹配的路径
if index == len(word) - 1:
return True
# 暂时标记当前单元格,防止重复访问
temp, board[i][j] = board[i][j], '#'
# 搜索四个方向
found = dfs(board, i + 1, j, word, index + 1) or \
dfs(board, i - 1, j, word, index + 1) or \
dfs(board, i, j + 1, word, index + 1) or \
dfs(board, i, j - 1, word, index + 1)
# 回溯,恢复单元格的原始值
board[i][j] = temp
return found
# 遍历整个网格
for i in range(len(board)):
for j in range(len(board[0])):
if dfs(board, i, j, word, 0): # 从每个单元格开始尝试搜索
return True
return False
Java
复制代码
public class Solution {
public boolean exist(char[][] board, String word) {
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
if (dfs(board, i, j, word, 0)) {
return true;
}
}
}
return false;
}
private boolean dfs(char[][] board, int x, int y, String word, int index) {
if (index == word.length()) {
return true;
}
if (x < 0 || x >= board.length || y < 0 || y >= board[0].length || board[x][y] != word.charAt(index)) {
return false;
}
char temp = board[x][y];
board[x][y] = '/'; // 标记当前格子为已访问
boolean found = dfs(board, x + 1, y, word, index + 1) || dfs(board, x - 1, y, word, index + 1) ||
dfs(board, x, y + 1, word, index + 1) || dfs(board, x, y - 1, word, index + 1);
board[x][y] = temp; // 回溯,撤销标记
return found;
}
}
130. 被围绕的区域
给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。
class Solution:
def solve(self, board: List[List[str]]) -> None:
if not board or not board[0]:
return
rows, cols = len(board), len(board[0])
def dfs(i, j):
if 0 <= i < rows and 0 <= j < cols and board[i][j] == 'O':
board[i][j] = 'M'
dfs(i + 1, j)
dfs(i - 1, j)
dfs(i, j + 1)
dfs(i, j - 1)
for i in range(rows):
dfs(i, 0)
dfs(i, cols - 1)
for j in range(cols):
dfs(0, j)
dfs(rows - 1, j)
for i in range(rows):
for j in range(cols):
if board[i][j] == 'O':
board[i][j] = 'X'
elif board[i][j] == 'M':
board[i][j] = 'O'
Java
复制代码
public class Solution {
public void solve(char[][] board) {
if (board == null || board.length == 0 || board[0].length == 0) return;
int rows = board.length, cols = board[0].length;
for (int i = 0; i < rows; i++) {
dfs(board, i, 0);
dfs(board, i, cols - 1);
}
for (int j = 0; j < cols; j++) {
dfs(board, 0, j);
dfs(board, rows - 1, j);
}
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (board[i][j] == 'O') board[i][j] = 'X';
else if (board[i][j] == 'M') board[i][j] = 'O';
}
}
}
private void dfs(char[][] board, int i, int j) {
int rows = board.length, cols = board[0].length;
if (i < 0 || i >= rows || j < 0 || j >= cols || board[i][j] != 'O') return;
board[i][j] = 'M';
dfs(board, i + 1, j);
dfs(board, i - 1, j);
dfs(board, i, j + 1);
dfs(board, i, j - 1);
}
}