LeetCode.474 一和零 Java代码
题目描述:
给你一个二进制字符串数组 strs 和两个整数 m 和 n 。
请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。
如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。
解题思路:
这道题目我认为是一个0-1背包问题,很多人认为是一个多重背包。
其中:多重背包是指每个物品、数量不同(每个物品可以复用)。
本题中的物品其实是strs这一字符串数组的元素,其中题目中所说的m和n其实是相对于背包的两个维度。
因此,这个题目:
两个维度:m和n。
不同的待装物品:strs数组中的各个元素。
所以属于具有多个维度的0-1背包问题。
解题思路:
- 确定dp数组所代表的含义
- 确定dp数组的递推公式
- 确定dp数组的初始数值
- 确定遍历顺序
解题过程:
-
确定dp数组所代表的含义:
dp[i] [j]表示 最多有 i 个 0 和 j 个 1 的strs最大子集的大小为dp[i] [j] -
确定递推公式:
由于题目属于0-1背包问题,所以大体递推公式可以根据0-1背包推出,思路如下:
-
确定dp数组的初始数值
dp[i] [j] 初始为0即可
-
确定遍历顺序
由0-1背包,类似的得出遍历顺序。
题解代码:
public int findMaxForm(String[] strs, int m, int n) {
int dp[][] = new int[m+1][n+1];
for (String str:strs) {
int one_Num = 0;
int zero_Num = 0;
for (int i = 0;i<str.length();i++) {
if(str.charAt(i) == '0') zero_Num++;
else one_Num++;
}
for (int i = m;i>=zero_Num;i--){
for(int j = n;j>=one_Num;j--){
dp[i][j] = Math.max(dp[i][j],dp[i - zero_Num][j - one_Num]+1);
}
}
}
return dp[m][n];
}