class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
/*
题意分解:
最大子集长度 -> 在strs数组中选择最多的元素,保证'0'的数量 <= m, '1'的数量 <= n;
dp[i][j] : 表示在strs数组中选,同时保证0的数量 <= i, 1的数量 <= j,选出的最多的元素数目
dp[i][j] : max(不选该元素, 选择该元素则+1)
dp[i][j] = max(dp[i][j], dp[i - nums0[i]][j - nums1[i]] + 1)
*/
int size = strs.size();
vector<int> nums0(size);
vector<int> nums1(size);
for(int i = 0; i < size; i ++){
nums0[i] = findZeroNums(strs[i]);
nums1[i] = findOneNums(strs[i]);
}
vector<vector<int>> dp(101,vector<int>(101));
for(int k = 0; k < size; k ++){ //遍历strs每个元素
for(int i = m; i >= nums0[k] ; i --){ //两层for循环遍历两种条件来更新dp
for(int j = n; j >= nums1[k] ; j --){
dp[i][j] = max(dp[i][j], dp[i - nums0[k]][j - nums1[k]] + 1);
}
}
}
return dp[m][n];
}
private:
int findZeroNums(string str){ //找到字符串中0的个数
int nums0 = 0;
for(auto c : str){
if(c == '0') nums0 ++;
}
return nums0;
}
int findOneNums(string str){ //找到字符串中1的个数
int nums1 = 0;
for(auto c : str){
if(c == '1') nums1 ++;
}
return nums1;
}
};
<Talk is cheap, show me the code 11> LeetCode.474 一和零
于 2024-06-27 20:13:38 首次发布