Skip to content

Commit 116464b

Browse files
authored
Update construct-string-with-minimum-cost-easy.cpp
1 parent fd37b29 commit 116464b

File tree

1 file changed

+31
-31
lines changed

1 file changed

+31
-31
lines changed

C++/construct-string-with-minimum-cost-easy.cpp

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,37 @@
1-
// Time: O(n^2 + w * l)
2-
// Space: O(t)
1+
// Time: O(n * w * l)
2+
// Space: O(l)
33

44
static const int INF = numeric_limits<int>::max();
55

6-
// trie, dp
6+
// dp
77
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 {
835
private:
936
class Trie {
1037
public:
@@ -73,7 +100,7 @@ class Solution {
73100
// Time: O(n^2 + w * l)
74101
// Space: O(t)
75102
// trie, dp
76-
class Solution2 {
103+
class Solution3 {
77104
private:
78105
struct TrieNode {
79106
int cost = INF;
@@ -132,30 +159,3 @@ class Solution2 {
132159
return dp.back() != INF ? dp.back() : -1;
133160
}
134161
};
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

Comments
 (0)