1+ // Time: O(T * S^T)
2+ // Space: O(T * S^T)
3+
4+ class Solution {
5+ public:
6+ int minStickers (vector<string>& stickers, string target) {
7+ vector<vector<int >> sticker_counts (stickers.size (), vector<int >(26 ));
8+ unordered_map<string, int > dp;
9+ for (int i = 0 ; i < stickers.size (); ++i) {
10+ for (const auto & c : stickers[i]) {
11+ ++sticker_counts[i][c - ' a' ];
12+ }
13+ }
14+ dp[" " ] = 0 ;
15+ return minStickersHelper (sticker_counts, target, &dp);
16+ }
17+
18+ private:
19+ int minStickersHelper (const vector<vector<int >>& sticker_counts, const string& target,
20+ unordered_map<string, int > *dp) {
21+ if (dp->count (target)) {
22+ return (*dp)[target];
23+ }
24+ int result = numeric_limits<int >::max ();
25+ vector<int > target_count (26 );
26+ for (const auto & c : target) {
27+ ++target_count[c - ' a' ];
28+ }
29+ for (const auto & sticker_count : sticker_counts) {
30+ if (sticker_count[target[0 ] - ' a' ] == 0 ) {
31+ continue ;
32+ }
33+ string new_target;
34+ for (int i = 0 ; i < target_count.size (); ++i) {
35+ if (target_count[i] - sticker_count[i] > 0 ) {
36+ new_target += string (target_count[i] - sticker_count[i], ' a' + i);
37+ }
38+ }
39+ if (new_target.length () != target.length ()) {
40+ int num = minStickersHelper (sticker_counts, new_target, dp);
41+ if (num != -1 ) {
42+ result = min (result, 1 + num);
43+ }
44+ }
45+ }
46+ (*dp)[target] = (result == numeric_limits<int >::max ()) ? -1 : result;
47+ return (*dp)[target];
48+ }
49+ };
0 commit comments