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