一和零
给定一个二进制字符串数组str和两个整数m和n,
找出并返回strs的最大子集的大小,该子集中最多有m个0和n个1。
如果x的所有元素也是y的元素,集合x是集合y的子集。
思路
这是一道0-1背包的变体:
str数组中的元素是物品,每个物品只能使用一次;
m和n相当于一个背包,每个维度的背包。
代码实现
class Solution {
public int findMaxForm(String[] strs, int m, int n) {
int[][] dp = new int[m + 1][n + 1];
// dp[i][j] 表示m = i,n = j 可装的最大子集数
for (int i = 0; i < strs.length; i++) {
String str = strs[i];
int count0 = 0;
int count1 = 0;
char[] chars = str.toCharArray();
for (char c :chars) {
if (c == '0'){
count0 ++;
}
if (c == '1'){
count1 ++;
}
}
for (int j = m; j >= count0 ; j--) {
for (int k = n; k >= count1 ; k--) {
dp[j][k] = Math.max(dp[j][k],dp[j - count0][k - count1] + 1);
}
}
}
return dp[m][n];
}
}