代码随想录 474. 一和零

题目
给你一个二进制字符串数组 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 。

解题思路
本题本质上是有两个维度的01背包问题,统计每个字符串的01个数,用dp[i][j]表示最大有i个0和j个1的最大子集的长度。有递推公式dp[i][j] = max(dp[i][j], dp[i-ZeroNum][j-OneNum] + 1). 最后返回dp[m][n].

代码实现

class Solution {
   
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
   
        if (strs.size() * m == 0 || strs.size() * n == 0) {
   
            return 0;
        }
        vector<vector<int>> dp(m+1,vector<int> (n+1,0));
        for (string str : strs) {
    // 遍历物品
            int oneNum = 0, zeroNum = 0;
            for (char c : str) {
   
                if (c == '0') zeroNum++;
                else oneNum++;
            }
            for (int i = m; i >= zeroNum; i--) {
    // 遍历背包容量且从后向前遍历!
                for (int j = n; j >= oneNum; j--) {
   
                    dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);
                    cout << "dp[i][j] = " << dp[i][j] << endl;
                }
            }
        }
        return dp[m][n];
    }
};

相关推荐

  1. 代码随想 474.

    2023-12-17 19:32:04       37 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-17 19:32:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-17 19:32:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-17 19:32:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-17 19:32:04       20 阅读

热门阅读

  1. LeetCode 每日一题 2023/12/11-2023/12/17

    2023-12-17 19:32:04       43 阅读
  2. Vue基础

    Vue基础

    2023-12-17 19:32:04      34 阅读
  3. 浅谈Web Component

    2023-12-17 19:32:04       31 阅读
  4. 【Linux应用编程笔记】GPIO

    2023-12-17 19:32:04       33 阅读
  5. 网线制作方法及注意事项

    2023-12-17 19:32:04       39 阅读
  6. vue 中 watch 、computed、 watchEffect 区别

    2023-12-17 19:32:04       39 阅读
  7. 如何看待【前端】已死论?

    2023-12-17 19:32:04       37 阅读
  8. 线程Thread源代码思想学习1

    2023-12-17 19:32:04       36 阅读
  9. mysql查询-DQL查询语法-执行顺序--黑马程序员笔记

    2023-12-17 19:32:04       29 阅读
  10. 【Linux】项目自动化构建工具 - make/Makefile

    2023-12-17 19:32:04       40 阅读
  11. PAT乙级1017 A除以B

    2023-12-17 19:32:04       41 阅读