해당 포스트는 LeetCode의 코딩 인터뷰 문제 Word Break에 대한 풀이입니다. 해당 풀이는 Optimal이 아닌 단순히 Submission을 통과한 것입니다.
문제 출처 : https://leetcode.com/problems/word-break/
카테고리 : DP
난이도 : 쉬움 ~ 어려움 (풀이에 따라서 다름)
주어진 문자열 s를 dict내의 문자들을 조합해서 만들 수 있는지 여부를 출력하시오.
예) s = “wordbreak”이고 dict = [“word”, “break”]이면 True를 출력한다.
예) s = “wordbreakword”이고 dict = [“word”, “break”]이면 True를 출력한다.
예) s = “wordbreaks”이고 dict = [“word”, “break”]이면 False를 출력한다.
이 문제의 풀이를 위해 Boolean 배열 Visited를 사용한다. visited[i]는 s[0 : i]의 부분 문자열을 dict내의 문자들을 조합해서 만들 수 있다는 것을 의미한다. s의 길이를 N이라고 할 때, i를 0에서 N – 1까지 iteration 시킨다.
visited[i]가 0인 경우 s[0 : i]까지의 부분 문자열은 이미 완성되었으므로, 그 다음으로 붙일 수 있는 것을 찾는다. dict내의 단어 word에 대해 word가 s[i : i + len(word)]와 같으면 그 뒤에 이어붙일 수 있다. 그렇다면 visited[i + len(word)]에 True를 할당한다.
for loop문이 끝난 후에 visited[N + 1]을 리턴하면 된다.
※ KMP 알고리즘을 사용하면 위 풀이를 더 발전시킬 수 있다. KMP 알고리즘으로 각 word가 s에 출현하는 위치 i를 찾아낸다. 이 연산의 속도는 O(len(s) + len(word))이다. match는 set의 배열로, match[i]는 s[i : i + len(word)] == word인 word들의 길이를 저장하는 set이다. 기존 풀이의 for loop에서 각 i에 대해서 match[i]의 값들을 참조해 visited를 채워나가면 매번 s[i + len(word)]와 word를 비교하는 낭비를 없앨 수 있다.
class Solution(object):
def wordBreak(self, s, wordDict):
"""
:type s: str
:type wordDict: List[str]
:rtype: bool
"""
visited = [0] * (len(s) + 1)
visited[0] = True
length = len(s)
for i in range(length):
if not visited[i]:
continue
for word in wordDict:
if len(word) <= length - i and word == s[i:i + len(word)]:
visited[i + len(word)] = True
return visited[length]
합격왕 우여곡절 끝에 드디어 합격왕에 광고를 붙였다. 서비스를 시작한지 무려 4년이 지나서야 드디어 광고를 시작하게…
반복적인 일상 매일 아침 일어나 회사에 출근하고, 저녁을 먹고 돌아오는 일상의 반복이다. 주말은 가족을 보러…
Planning A well-structured plan has the following characteristics: First, the ultimate vision you aim to…
English The most common problem for English learners like myself is that we often use…
This website uses cookies.