Skip to content

Commit 44d145f

Browse files
committed
Add solution of word-search
1 parent 2e211b0 commit 44d145f

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed

word-search/bhyun-kim.py

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
"""
2+
79. Word Search
3+
https://leetcode.com/problems/word-search/
4+
5+
Solution:
6+
To solve this problem, we think of the board as a graph.
7+
We can use a depth-first search (DFS) to explore all possible paths starting from each cell.
8+
We can create a helper function that takes the current cell and the index of the current character in the word.
9+
10+
- We can count the frequency of each character in the board.
11+
- We can check if all characters in the word exist in the board.
12+
- If we cannot find all characters in the board, we return False.
13+
14+
- We can create a helper function that takes the current coordinates and the index in the word.
15+
- If the index is equal to the length of the word,
16+
it means we have found all characters in the word, so we return True.
17+
- If the coordinates are out of bounds or the current character does not match,
18+
we return False.
19+
- We mark the current cell as visited and explore all possible directions.
20+
- If any direction returns True, we return True.
21+
- We unmark the current cell and return False.
22+
23+
- We can find all indices of the first character in the word.
24+
- We can start the DFS from each index and return True if any DFS returns True.
25+
- If no DFS returns True, we return False.
26+
27+
Time complexity: O(m*n*4^l)
28+
- m and n are the dimensions of the board.
29+
- l is the length of the word.
30+
- We explore 4 directions at each cell, and the maximum depth is the length of the word.
31+
32+
Space complexity: O(l)
33+
- The recursive call stack has a maximum depth of the length of the word.
34+
35+
"""
36+
37+
38+
from typing import List
39+
40+
class Solution:
41+
def exist(self, board: List[List[str]], word: str) -> bool:
42+
if not board or not word:
43+
return False
44+
45+
m, n = len(board), len(board[0])
46+
47+
# Step 1: Check if all characters in the word exist in the board
48+
char_count = {}
49+
for row in board:
50+
for char in row:
51+
if char in char_count:
52+
char_count[char] += 1
53+
else:
54+
char_count[char] = 1
55+
56+
for char in word:
57+
if char not in char_count or char_count[char] == 0:
58+
return False
59+
char_count[char] -= 1
60+
61+
# Helper function to check if the word can be found starting from (i, j)
62+
def dfs(i, j, word_index):
63+
if word_index == len(word):
64+
return True
65+
66+
if i < 0 or i >= m or j < 0 or j >= n or board[i][j] != word[word_index]:
67+
return False
68+
69+
temp = board[i][j]
70+
board[i][j] = "#" # mark as visited
71+
72+
# Explore all possible directions
73+
found = (dfs(i + 1, j, word_index + 1) or
74+
dfs(i - 1, j, word_index + 1) or
75+
dfs(i, j + 1, word_index + 1) or
76+
dfs(i, j - 1, word_index + 1))
77+
78+
board[i][j] = temp # unmark
79+
return found
80+
81+
# Step 2: Find all indices of the first character in the word
82+
for i in range(m):
83+
for j in range(n):
84+
if board[i][j] == word[0] and dfs(i, j, 0):
85+
return True
86+
87+
return False

0 commit comments

Comments
 (0)