Skip to content

Commit a3b72bd

Browse files
committed
Solution: Word Break
1 parent ea4e428 commit a3b72bd

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

โ€Žword-break/flynn.pyโ€Ž

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
'''
2+
ํ’€์ด
3+
- BFS์™€ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋ฐฉ์‹์„ ์ด์šฉํ•˜์—ฌ ํ’€์ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
4+
- ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด s์˜ ๊ธธ์ด n๋ณด๋‹ค 1 ๋” ํฐ ํฌ๊ธฐ์˜ ๋ฐฐ์—ด visit์„ False๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ค๋‹ˆ๋‹ค
5+
n + 1๋กœ ์„ค์ •ํ•˜๋Š” ์ด์œ ๋Š” BFS ์„ค๊ณ„๋ฅผ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค
6+
- queue ๊ธฐ๋Šฅ์„ ํ•ด์ค„ deque์ธ dq๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๊ณ  ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ 0์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค
7+
dq์˜ ์›์†Œ curr๊ฐ€ ๊ฐ–๋Š” ์˜๋ฏธ๋Š” `ํ˜„์žฌ ํƒ์ƒ‰ ์ค‘์ธ substring์˜ ์‹œ์ž‘ index, ์ฆ‰ s[curr:]์ž…๋‹ˆ๋‹ค`
8+
- while๋ฌธ์„ ์ง„ํ–‰ํ•˜๋ฉฐ dq์—์„œ curr๋ฅผ popํ•ด์ค๋‹ˆ๋‹ค
9+
๋งŒ์•ฝ curr๋ฅผ ํƒ์ƒ‰ํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด ์ง€๋‚˜์น˜๊ณ , ํƒ์ƒ‰ํ•œ ์ ์ด ์—†๋‹ค๋ฉด starts_with ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ 
10+
๊ทธ ์—ฌ๋ถ€์— ๋”ฐ๋ผ dq์— curr๋ฅผ ์ถ”๊ฐ€ ๋ฐ visit์„ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค
11+
12+
Big O
13+
- N: ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด s์˜ ๊ธธ์ด
14+
- M: ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด ๋ฐฐ์—ด wordDict์˜ ๋ชจ๋“  ๋ฌธ์ž์—ด์˜ ๊ธธ์ด์˜ ํ•ฉ
15+
16+
- Time complexity: O(N * M)
17+
- visit ๋ฐฐ์—ด๋กœ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํƒ์ƒ‰์€ ์ตœ๋Œ€ N๋ฒˆ ์ด๋ค„์ง‘๋‹ˆ๋‹ค
18+
- ๊ฐ ํƒ์ƒ‰๋งˆ๋‹ค wordDict๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ starts_with๋ฅผ ์‹คํ–‰ํ•˜๋Š”๋ฐ ์ด ์‹คํ–‰ ์‹œ๊ฐ„์€ M์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์„ ํ˜•์ ์œผ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค
19+
20+
- Space complexity: O(N)
21+
- visit ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” N์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์„ ํ˜•์ ์œผ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค
22+
- deque์— ๋‹ด๊ธด ์›์†Œ์˜ ์ˆ˜๋Š” ์ตœ๋Œ€ N๊นŒ์ง€ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
23+
'''
24+
25+
class Solution:
26+
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
27+
n = len(s)
28+
visit = [False] * (n + 1)
29+
30+
def starts_with(idx: int, word: str) -> bool:
31+
m = len(word)
32+
for i in range(m):
33+
if s[idx + i] != word[i]:
34+
return False
35+
return True
36+
37+
dq = deque([0])
38+
39+
while dq:
40+
curr = dq.popleft()
41+
42+
if curr == len(s):
43+
return True
44+
45+
for word in wordDict:
46+
m = len(word)
47+
if curr + m <= n and not visit[curr + m] and starts_with(curr, word):
48+
dq.append(curr + m)
49+
visit[curr + m] = True
50+
51+
return False

0 commit comments

Comments
ย (0)