0
点赞
收藏
分享

微信扫一扫

Leetcode 474. 一和零(未解决)

五殳师兄 2022-04-23 阅读 55
c++

给你一个二进制字符串数组 strs 和两个整数 m 和 n 。

请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。

如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。

示例 1:

输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3
输出:4
解释:最多有 5031 的最大子集是 {"10","0001","1","0"} ,因此答案是 4 。
其他满足题意但较小的子集包括 {"0001","1"}{"10","1","0"}{"111001"} 不满足题意,因为它含 41 ,大于 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;
    }
};
举报

相关推荐

0 条评论