给你一个二进制字符串数组 strs 和两个整数 m 和 n 。
请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。
如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。
示例 1:
输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3
输出:4
解释:最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4 。
其他满足题意但较小的子集包括 {"0001","1"} 和 {"10","1","0"} 。{"111001"} 不满足题意,因为它含 4 个 1 ,大于 n 的值 3 。
示例 2:
输入:strs = ["10", "0", "1"], m = 1, n = 1
输出:2
解释:最大的子集是 {"0", "1"} ,所以答案是 2 。
主要思路:原本是想用dfs罗列出所有子集然后再去判断,发现太耗时
Code:
class Solution {
public:
void dfs(vector<string> S, vector<vector<string> >& subs, vector<string> sub, int start)
{
subs.push_back(sub);
for (int i = start; i < S.size(); i++)
{
sub.push_back(S[i]); //要
dfs(S, subs, sub, i + 1);
sub.pop_back(); //不要 (注意这个sub是传值,所以pop_back就可以)
}
}
int findMaxForm(vector<string>& strs, int m, int n) {
vector<vector<string> > subs;
vector<string> sub;
dfs(strs, subs, sub, 0);
int maxcount = 0;
for (int i = 0; i < subs.size(); i++)
{
vector<string>vec = subs[i];
string res = "";
for (int j = 0; j < vec.size(); j++)
{
res += vec[j];
}
int count1 = count(res.begin(), res.end(), '0');
int count2 = count(res.begin(), res.end(), '1');
if ((count1 <= m) && (count2 <= n))
{
maxcount = max((int)vec.size(), maxcount);
}
}
return maxcount;
}
};