一和零
题目
一和零
给你一个二进制字符串数组strs和两个整数m和n。请你找出并返回strs的最大子集的长度,该子集中最多有m个0和n个1。如果x的所有元素也是y的元素,集合x是集合y的子集。
示例
![]() |
|---|
解题思路
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];
}
};


浙公网安备 33010602011771号