@@ -261,8 +261,70 @@ public:
261261
262262## 其他语言版本
263263
264-
265264### Java
265+
266+ 三维DP数组实现
267+
268+ ``` java
269+ class Solution {
270+ public int findMaxForm (String [] strs , int m , int n ) {
271+ // / 数组有三个维度
272+ // 第一个维度:取前面的几个字符串
273+ // 第二个维度:0的数量限制(背包维度 1 容量)
274+ // 第三个维度:1的数量限制(背包维度 2 容量)
275+ int [][][] dpArr = new int [strs. length][m + 1 ][n + 1 ];
276+
277+ // / 初始化dpArr数组
278+ // 计算第一个字符串的零数量和1数量
279+ int zeroNum = 0 ;
280+ int oneNum = 0 ;
281+ for (char c : strs[0 ]. toCharArray()) {
282+ if (c == ' 0' ) {
283+ zeroNum++ ;
284+ } else {
285+ oneNum++ ;
286+ }
287+ }
288+ // 当0数量、1数量都容得下第一个字符串时,将DP数组的相应位置初始化为1,因为当前的子集数量为1
289+ for (int j = zeroNum; j <= m; j++ ) {
290+ for (int k = oneNum; k <= n; k++ ) {
291+ dpArr[0 ][j][k] = 1 ;
292+ }
293+ }
294+ // / 依次填充加入第i个字符串之后的DP数组
295+ for (int i = 1 ; i < strs. length; i++ ) {
296+ zeroNum = 0 ;
297+ oneNum = 0 ;
298+ for (char c : strs[i]. toCharArray()) {
299+ if (c == ' 0' ) {
300+ zeroNum++ ;
301+ } else {
302+ oneNum++ ;
303+ }
304+ }
305+ for (int j = 0 ; j <= m; j++ ) {
306+ for (int k = 0 ; k <= n; k++ ) {
307+ if (j >= zeroNum && k >= oneNum) {
308+ // --if-- 当0数量维度和1数量维度的容量都大于等于当前字符串的0数量和1数量时,才考虑是否将当前字符串放入背包
309+ // 不放入第i个字符串,子集数量仍为 dpArr[i - 1][j][k]
310+ // 放入第i个字符串,需要在0维度腾出 zeroNum 个容量,1维度腾出 oneNum 个容量,然后放入当前字符串,即 dpArr[i - 1][j - zeroNum][k - oneNum] + 1)
311+ dpArr[i][j][k] = Math . max(dpArr[i - 1 ][j][k], dpArr[i - 1 ][j - zeroNum][k - oneNum] + 1 );
312+ } else {
313+ // --if-- 无法放入第i个字符串,子集数量仍为 dpArr[i - 1][j][k]
314+ dpArr[i][j][k] = dpArr[i - 1 ][j][k];
315+ }
316+ }
317+ }
318+ }
319+ return dpArr[dpArr. length - 1 ][m][n];
320+ }
321+ }
322+ ```
323+
324+
325+
326+ 二维DP数组实现
327+
266328``` Java
267329class Solution {
268330 public int findMaxForm (String [] strs , int m , int n ) {
@@ -682,3 +744,4 @@ public class Solution
682744<a href =" https://programmercarl.com/other/kstar.html " target =" _blank " >
683745 <img src =" ../pics/网站星球宣传海报.jpg " width =" 1000 " />
684746</a >
747+
0 commit comments