|
1 |
| -// Time: O(n^2 + w * l) |
2 |
| -// Space: O(t) |
| 1 | +// Time: O(n * w * l) |
| 2 | +// Space: O(l) |
3 | 3 |
|
4 | 4 | static const int INF = numeric_limits<int>::max();
|
5 | 5 |
|
6 |
| -// trie, dp |
| 6 | +// dp |
7 | 7 | class Solution {
|
| 8 | +public: |
| 9 | + int minimumCost(string target, vector<string>& words, vector<int>& costs) { |
| 10 | + int l = 0; |
| 11 | + for (const auto& w : words) { |
| 12 | + l = max(l, static_cast<int>(size(w))); |
| 13 | + } |
| 14 | + vector<int> dp(l + 1, INF); |
| 15 | + dp[0] = 0; |
| 16 | + for (int i = 0; i < size(target); ++i) { |
| 17 | + if (dp[i % size(dp)] == INF) { |
| 18 | + continue; |
| 19 | + } |
| 20 | + for (int j = 0; j < size(words); ++j) { |
| 21 | + if (target.substr(i, size(words[j])) == words[j]) { |
| 22 | + dp[(i + size(words[j])) % size(dp)] = min(dp[(i + size(words[j])) % size(dp)], dp[i % size(dp)] + costs[j]); |
| 23 | + } |
| 24 | + } |
| 25 | + dp[i % size(dp)] = INF; |
| 26 | + } |
| 27 | + return dp[size(target) % size(dp)] != INF ? dp[size(target) % size(dp)] : -1; |
| 28 | + } |
| 29 | +}; |
| 30 | + |
| 31 | +// Time: O(n^2 + w * l) |
| 32 | +// Space: O(t) |
| 33 | +// trie, dp |
| 34 | +class Solution2 { |
8 | 35 | private:
|
9 | 36 | class Trie {
|
10 | 37 | public:
|
@@ -73,7 +100,7 @@ class Solution {
|
73 | 100 | // Time: O(n^2 + w * l)
|
74 | 101 | // Space: O(t)
|
75 | 102 | // trie, dp
|
76 |
| -class Solution2 { |
| 103 | +class Solution3 { |
77 | 104 | private:
|
78 | 105 | struct TrieNode {
|
79 | 106 | int cost = INF;
|
@@ -132,30 +159,3 @@ class Solution2 {
|
132 | 159 | return dp.back() != INF ? dp.back() : -1;
|
133 | 160 | }
|
134 | 161 | };
|
135 |
| - |
136 |
| -// Time: O(n * w * l) |
137 |
| -// Space: O(l) |
138 |
| -// dp |
139 |
| -class Solution3 { |
140 |
| -public: |
141 |
| - int minimumCost(string target, vector<string>& words, vector<int>& costs) { |
142 |
| - int l = 0; |
143 |
| - for (const auto& w : words) { |
144 |
| - l = max(l, static_cast<int>(size(w))); |
145 |
| - } |
146 |
| - vector<int> dp(l + 1, INF); |
147 |
| - dp[0] = 0; |
148 |
| - for (int i = 0; i < size(target); ++i) { |
149 |
| - if (dp[i % size(dp)] == INF) { |
150 |
| - continue; |
151 |
| - } |
152 |
| - for (int j = 0; j < size(words); ++j) { |
153 |
| - if (target.substr(i, size(words[j])) == words[j]) { |
154 |
| - dp[(i + size(words[j])) % size(dp)] = min(dp[(i + size(words[j])) % size(dp)], dp[i % size(dp)] + costs[j]); |
155 |
| - } |
156 |
| - } |
157 |
| - dp[i % size(dp)] = INF; |
158 |
| - } |
159 |
| - return dp[size(target) % size(dp)] != INF ? dp[size(target) % size(dp)] : -1; |
160 |
| - } |
161 |
| -}; |
0 commit comments