leetcode 474. 一和零
题目描述:
给你一个二进制字符串数组strs和两个整数m和n。
请你找出并返回strs的最大子集的大小,该子集中最多有m个0和n个1 。
如果x的所有元素也是y的元素,集合x是集合y的子集。
这个题目有点类似于0-1背包问题,但是它比0-1背包问题更加复杂,因为它有m和n两个限制条件。
因此我们可以创建一个二维数组vec,vec[i][j]表示在限制条件为最多有i个0和j个1时,可以存放的最多的字符串数。数组的第一行和第一列均为0。
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
vector<vector<int> > vec(m + 1, vector<int> (n + 1, 0));
for(string s:strs)
{
int oneNum = 0, zeroNum = 0;
for(char c : s)
{
if(c == '1')
{
oneNum ++;
}
else
zeroNum++;
}
for(int i=m;i>=0;i--)
{
for(int j=n;j>=0;j--)
{
if(i>=zeroNum&&j>=oneNum)
vec[i][j] = max(vec[i-zeroNum][j-oneNum]+1,vec[i][j]);
}
}
}
return vec[m][n];
}
};