leet-139-word-break
string s : 단어
vector& wordDict : 단어 리스트
s가 2번 단어 리스트로 분해될 수 있는지 여부에 대해 리턴.
2번 단어리스트는
1번 단어를 분해하기 위해 2번 단어 리스트를 여러번 사용 될 수 있고
중복된 단어를 포함할 수 없음
남들이 해결한 방법
일단 점화식을 세워보자.
D[N] : N번째로 끝나는 단어의 분해 여부
D[N-1] : N-1번째로 끝나는 단어의 분해 여부
이 때, D[N]은 (0,N), (1,N-1), (2,N-2), ...(N-1, N) 으로 분해될 수 있다. 그래서 D[N]을 다음과 같이 나타낼 수 있다.
D[N] = (D[N-i] && s.substr(i, N)이 wordDict에 있는 단어인지) (0<=i<=N)
이 점화식을 바탕으로 코드를 작성해보자.
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
if (wordDict.size() == 0) {
return false;
}
vector<bool> endHere(s.size() + 1, false);
endHere[0] = true;
for (int i = 1; i <= s.size(); i++) {
for (int j = i - 1; j >= 0; j--) {
if (endHere[j]) {
string word = s.substr(j, i - j);
// find는 wordDict begin~end 사이에 word가 있으면 첫번째 value를, 없으면 end를 리턴.
if (find(wordDict.begin(), wordDict.end(), word) != wordDict.end()) {
endHere[i] = true;
break;
}
}
}
}
return endHere[s.size()];
}
};
시간복잡도
O(n^2)
공간복잡도
O(n)
Summary
점화식을 잘 세우자... 세워진 점화식에는 여러가지 경우의수가 있을 수 있다. 이 때, 2차원 배열의 매모이즈 공간을 필요로 할 수 있다. 이 문제는 어차피 word break가 가능 여부(true/false)를 구하기 때문에 1차원 배열만을 필요로 했다.
점화식에 대해 여러 경우의수가 있을 수 있음을 고려하자
Last updated
Was this helpful?