class Solution:
def __init__(self):
def neighbors(self, board, visited, point):
[row, col] = point
neighbor = []
if row > 0 and not visited[row - 1][col]:
neighbor.append([row-1, col])
if row < len(board) - 1 and not visited[row+1][col]:
neighbor.append([row+1, col])
if col > 0 and not visited[row][col-1]:
neighbor.append([row, col-1])
if col < len(board[row]) - 1 and not visited[row][col+1]:
neighbor.append([row, col+1])
return neighbor
def dfs(self, board, visited, word, current, candidates):
[current_row, current_col] = current
visited[current_row][current_col] = True
if not word:
return True
for candidate in candidates:
[x, y] = candidate
if not visited[x][y] and word[0] == board[x][y]:
visited[x][y] = True
neighbor = self.neighbors(board, visited, candidate)
if not self.dfs(board, visited, word[1:], candidate, neighbor):
continue
return True
visited[current_row][current_col] = False
return False
def exist(self, board: List[List[str]], word: str) -> bool:
rows = len(board)
cols = len(board[0])
graphCount = dict()
wordCount = collections.Counter(word)
for i in range(rows):
for j in range(cols):
graphCount[board[i][j]] = graphCount.get(board[i][j], 0) + 1
for key,val in wordCount.items():
if key not in graphCount:
return False
if val > graphCount[key]:
return False
starting_points = []
for x, vx in enumerate(board):
for y, vy in enumerate(board[x]):
if board[x][y] == word[0]:
starting_points.append([x, y])
for starting_point in starting_points:
visited = [[False for i in range(cols)] for j in range(rows)]
neighbor = self.neighbors(board, visited, starting_point)
if self.dfs(board, deepcopy(visited), word[1:], starting_point, neighbor):
return True
else:
continue
return False