题目 474. 一和零
给你一个二进制字符串数组 strs 和两个整数 m 和 n 。
请你找出并返回 strs 的最大子集的大小,该子集中 最多 有 m 个 0 和 n 个 1 。
如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。
题解
动态规划,01背包问题的变种
将问题分解为二维的,以dp[m][n] 表示有m个0和n个1的最大子集的大小,通过遍历数组,对每个字符串的zeroNum和oneNum进行统计,并统计包括当前字符串0,1数目的并且符合0,1数目分别小于m,n条件的各个子集的大小。
注意要从后向前遍历,否则一个字符串可能被多次统计
代码
class Solution
{
public:
int count_0(const string &str)
{
int res(0);
for (auto i : str)
{
if (i == '0')
{
res++;
}
}
return res;
}
int count_1(const string &str)
{
return str.size() - count_0(str);
}
int findMaxForm(vector<string> &strs, int m, int n)
{
vector<vector<int>>recs(m+1,vector<int>(n+1,0));
for(auto s:strs)
{
int a = count_0(s);
int b = count_1(s);
for(int i = m;i>=a;--i)
{
for(int j = n;j>=b;--j)
{
recs[i][j] = max(recs[i][j],recs[i-a][j-b]+1);
}
}
}
return recs[m][n];
}
};