Skip to content

Commit 6f7162c

Browse files
committed
solve(w04): 79. Word Search
1 parent 4e5e642 commit 6f7162c

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

word-search/seungriyou.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# https://leetcode.com/problems/word-search/
2+
3+
from typing import List
4+
5+
class Solution:
6+
def exist(self, board: List[List[str]], word: str) -> bool:
7+
"""
8+
[Complexity]
9+
- TC: O(m * n * 4^L) (L = word의 길이)
10+
- 한 경로에서 최대 L번 재귀 호출
11+
- 각 cell 당 3~4 방향 가능
12+
- SC: O(m * n + L) (visited + call stack)
13+
- visited 배열 대신 board에 inplace로 표시하면 O(L)으로 최적화 가능
14+
15+
[Approach]
16+
주어진 word를 순차적으로 확인하기 위해 backtracking으로 접근할 수 있다. (가지치기 가능)
17+
맨 처음에 word를 구성하는 문자가 board에 모두 존재하는지 확인한다면 run time을 줄일 수 있다.
18+
"""
19+
# early stop (word를 구성하는 문자가 board에 모두 존재하는지 확인)
20+
if set(word) - set(l for row in board for l in row):
21+
return False
22+
23+
m, n = len(board), len(board[0])
24+
visited = [[False] * n for _ in range(m)]
25+
26+
def backtrack(r, c, idx):
27+
# base condition
28+
if idx == len(word):
29+
return True
30+
if (
31+
not (0 <= r < m and 0 <= c < n) # (1) 범위를 벗어나거나
32+
or visited[r][c] # (2) 이미 방문했거나
33+
or board[r][c] != word[idx] # (3) 주어진 word와 다른 경우
34+
):
35+
return False
36+
37+
# backtrack
38+
visited[r][c] = True
39+
if (
40+
backtrack(r - 1, c, idx + 1)
41+
or backtrack(r + 1, c, idx + 1)
42+
or backtrack(r, c - 1, idx + 1)
43+
or backtrack(r, c + 1, idx + 1)
44+
):
45+
return True
46+
visited[r][c] = False
47+
48+
return False
49+
50+
for i in range(m):
51+
for j in range(n):
52+
if backtrack(i, j, 0):
53+
return True
54+
55+
return False

0 commit comments

Comments
 (0)