Solving another interesting question today: Word Search. The hint suggested using Depth-First Search (DFS), but I couldn’t solve it that way. This is a problem I will definitely revisit in the future to see if I can figure it out.
I've actually come across this problem many times before, but every time I saw it, I got stuck for days and couldn't move forward. Eventually, I would give up on LeetCode altogether. Today, I finally accepted that it’s okay to look at solutions and learn from them.
Challenges I Faced
- I tend to avoid writing too many conditions in my code.
- I was too fixated on using DFS in a strict way and struggled to modify it to fit the problem.
Looking at the solutions, I noticed a pattern: they rely on multiple conditions using "or" statements:
if row < 0 or row >= len(board) or column < 0 or column >= len(board[0]) or board[row][column] != word[index]:
return False
This checks if the current position is out of bounds or if the character does not match.
Another key part of the solution is the recursive DFS call in four directions:
if dfs(row+1, column, index+1) or dfs(row-1, column, index+1) or
dfs(row, column+1, index+1) or dfs(row, column-1, index+1):
return True
This explores all possible paths until the word is found.
Lessons Learned
- Don't hesitate to write long conditions if they are necessary for the logic.
- It's okay to modify DFS logic instead of following it strictly.
- Understanding base cases and recursion flow is crucial in problems like this.
Solution Breakdown
-
Check if we have reached the end of the word. If so, return
True
. - Verify if the current character matches the word and is still within bounds.
-
If the it is out of bound or character does not match, return
False
. Otherwise, proceed. - Mark the cell as visited by replacing it with an empty string.
- Recursively search in all four directions.
- If result is
True
, returnTrue
. - Else, if the word is not found, restore the character.
- Start the search from each row and column.
Full Code:
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
# row and column is the position in the board, index is the index of the word
def dfs(row, column, index):
if index == len(word): # If the index equals the length of the word, return True
return True # Word has been found
# If out of bounds or character does not match
if row < 0 or row >= len(board) or column < 0 or column >= len(board[0]) or board[row][column] != word[index]:
return False
temp = board[row][column]
board[row][column] = '' # Mark as visited
# Check all 4 directions
if (dfs(row+1, column, index+1) or dfs(row-1, column, index+1) or
dfs(row, column+1, index+1) or dfs(row, column-1, index+1)):
return True
board[row][column] = temp # Restore character
return False
for row in range(len(board)):
for column in range(len(board[0])):
if dfs(row, column, 0):
return True
return False
That’s all for today! I’ll keep practicing and refining my approach to DFS. Hopefully, in the future, I’ll be able to solve this problem on my own without looking at solutions.