一和零

题目

一和零

给你一个二进制字符串数组strs和两个整数m和n。请你找出并返回strs的最大子集的长度,该子集中最多有m个0和n个1。如果x的所有元素也是y的元素,集合x是集合y的子集。

示例

image

解题思路

1.题目是找出数组中最大的子集。
2.此时可以让我们想到采用动态规划解决。
3.我们需要找到动态规划中的状态方程。
4.状态方程为dp[m][n] = max(dp[m][n], dp[m-zero][n-ones]+1);
5.于是我们只需要最后求得dp[m][n]即为集合最大子集。

代码

class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        vector<vector<int>> dp(m+1, vector<int>(n+1, 0));
        for(int i = 0; i < strs.size(); i++){
            int zero = 0;
            int ones = 0;
            for(int k = 0; k < strs[i].size(); k++){
                if(strs[i][k]=='0')zero++;
                else ones++;
            }
            for(int x = m ; x >= zero ; x--){
                for(int y = n ; y >= ones; y--){
                    dp[x][y] = max(dp[x][y], dp[x-zero][y-ones]+1);
                }
            }
        }
        return dp[m][n];
    }
};
posted @ 2026-03-12 20:55  heyuikn  阅读(2)  评论(0)    收藏  举报