File tree Expand file tree Collapse file tree 1 file changed +55
-0
lines changed Expand file tree Collapse file tree 1 file changed +55
-0
lines changed Original file line number Diff line number Diff line change
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
You can’t perform that action at this time.
0 commit comments