s의 끝부터 확인한다. 시작~!
노란색 화살표에 있는 문자 g
로 시작하는 단어가 wordDict
에 있는지 확인한다. 없다! DP[8] = F
이다.
같은 방식으로 o
로 시작하는 단어도 없기 때문에 DP[7] = F
다.
d
로 시작하는 단어로 dog
가 있다. 이때 dog
가 있다고 True가 되는 것이 아니라, 노란색 화살표에서 len("dog")
만큼 떨어진 빨간색 화살표에 있는 곳이 True면 DP[6] = T
가 된다. 이걸 왜 확인할까? 화살표가 있는 곳이 True라는 것은, 화살표가 가리키는 char로 시작하는 단어가 존재한다는 뜻이기 때문이다. 조금 헷갈린다면 뒤에 나오는 예시를 더 보자.
n
으로 시작하는 단어는 없기 때문에 DP[5] = F
이다.
a
로 시작하는 단어로 and
가 있다. 이때 len("and")
만큼 떨어진 곳이 True인지 확인한다. F이므로 DP[4] = F
가 된다.
🔥 DP[7] = DP[4] = T
라는 것은 wordDict에 "and"와 "og"가 있었다는 뜻이다. 하지만 "og"는 발견되지 않았으므로 DP[4] = F
이 된다.
s
로 시작하는 sand
가 있었지만 DP[7] = F
이므로 DP[3] = F
이다.
t
로 시작하는 단어는 없었다.
a
로 시작하는 and
가 있었지만 ats
와 달랐다.
c
로 시작하는 단어는 cats
와 cat
이 있다. 하나씩 살펴보자.
cats
일 때는 DP[4] = F
이므로 DP[0] = F
이다.cat
일 때는 DP[3] = F
이이므로 DP[0] = F
이다.DP[0] = F
이므로 결국 False가 리턴된다.
s의 끝부터 보는 법
class Solution:
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
DP = [False] * (len(s)+1)
DP[-1] = True
for i in range(len(s)-1, -1, -1):
for w in wordDict:
if i+len(w) <= len(s) and s[i:i+len(w)] == w:
DP[i] = DP[i+len(w)]
print(i, DP)
if DP[i]: break
return DP[0]
s의 앞부터 보는 법
i에서 시작하는 단어를 보는 게 아니라 이게 더 생각하기 복잡하다.
class Solution:
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
DP = [False] * (len(s)+1)
DP[0] = True
for i in range(len(s)):
for w in wordDict:
if i-len(w)+1 >= 0 and s[i-len(w)+1:i+1] == w:
DP[i+1] = DP[i-len(w)+1]
if DP[i+1]: break
return DP[-1]