Use DFS with backtracking. Search 4 directional neighbors for matching character sequence, marking visited cells temporarily with a dummy char.
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
ROWS, COLS = len(board), len(board[0])
def dfs(r, c, i):
if i == len(word):
return True
if (r < 0 or c < 0 or
r >= ROWS or c >= COLS or
board[r][c] != word[i]):
return False
tmp, board[r][c] = board[r][c], '#'
res = (dfs(r + 1, c, i + 1) or
dfs(r - 1, c, i + 1) or
dfs(r, c + 1, i + 1) or
dfs(r, c - 1, i + 1))
board[r][c] = tmp
return res
for r in range(ROWS):
for c in range(COLS):
if dfs(r, c, 0):
return True
return False
class Solution {
public boolean exist(char[][] board, String word) {
for (int r = 0; r < board.length; r++) {
for (int c = 0; c < board[0].length; c++) {
if (dfs(board, word, r, c, 0)) return true;
}
}
return false;
}
private boolean dfs(char[][] board, String word, int r, int c, int i) {
if (i == word.length()) return true;
if (r < 0 || r >= board.length || c < 0 || c >= board[0].length || board[r][c] != word.charAt(i)) {
return false;
}
char temp = board[r][c];
board[r][c] = '#';
boolean found = dfs(board, word, r + 1, c, i + 1) ||
dfs(board, word, r - 1, c, i + 1) ||
dfs(board, word, r, c + 1, i + 1) ||
dfs(board, word, r, c - 1, i + 1);
board[r][c] = temp;
return found;
}
}