一、题目
二、思路(自己)
- 先判断target中的字母在strickers中是否都包含,如果都包含则任务可以实现
- 需要得出target最小贴纸数量,感觉这一部分是比较难的
- 得到target中字母各项数目,然后再从strickers中一一组合,统计所需贴纸最少的一次
- 事实证明我这个方法不可行
三、题解(官方)
class Solution {
public int minStickers(String[] stickers, String target) {
int m = target.length();
int[] memo = new int[1 << m];
Arrays.fill(memo, -1);
memo[0] = 0;
int res = dp(stickers, target, memo, (1 << m) - 1);
return res <= m ? res : -1;
}
public int dp(String[] stickers, String target, int[] memo, int mask) {
int m = target.length();
if (memo[mask] < 0) {
int res = m + 1;
for (String sticker : stickers) {
int left = mask;
int[] cnt = new int[26];
for (int i = 0; i < sticker.length(); i++) {
cnt[sticker.charAt(i) - 'a']++;
}
for (int i = 0; i < target.length(); i++) {
char c = target.charAt(i);
if (((mask >> i) & 1) == 1 && cnt[c - 'a'] > 0) {
cnt[c - 'a']--;
left ^= 1 << i;
}
}
if (left < mask) {
res = Math.min(res, dp(stickers, target, memo, left) + 1);
}
}
memo[mask] = res;
}
return memo[mask];
}
}