LeetCode-474. 一和零
创始人
2024-06-03 20:11:39
0

目录

    • 题目思路
    • 动态规划
    • 动态规划(压缩)

题目来源
474. 一和零

题目思路

为了方便理解, 先把两个变量删掉一个, 那么题目变为: 返回最大子集的长度,该子集中最多有m个0
此时的解题思路就是正常的二维dp:

1.创建一个dp[len+1][m+1], 其中len = strs.length.
2.dp[i][j] 代表: 在[0-i]个字符串中, 0有i个时最多有几个子串.
3.那么递推公式:

if( i-zeros>=0) : dp[i][j] = Math.max(dp[i][j], dp[i-1][i-zeros] + 1); else : dp[i][j] = dp[i-1][j];
其中zeros=该字符串中0的数量.
解释一下这里为什么是dp[i-1][j-zeros] + 1, 因为如果要把当前第i个字符串算入子串的话, 需要zeros的容量, 所以前i-1的子串最多只能占i-zeros的容量.

理解了上面所说的一个变量的情况, 那么两个变量的情况就简单了, 就是在dp[len+1][m+1]后再加一个维度变成dp[len+1][m+1][n+1].

此时dp[i][j][k] 代表: 在[0-i]个字符串中, 0有j个, 1有k个时最多有几个子串.
递推公式变成:

if( j-zeros >= 0 && k-ones>=0) : dp[i][j][k] = Math.max(dp[i-1][j][k], dp[i-1][j-zeros][k-ones] + 1); else: dp[i][j][k] = dp[i-1][j][k];
其中zeros=该字符串中0的数量. ones代表该字符串中1的数量.
解释一下这里为什么是dp[i-1][j-zeros][k-ones] + 1, 因为如果要把当前第l个字符串算入子串的话, 需要zeros和ones的容量, 所以前i-1的子串最多只能占[j-zeros] && [k-ones]的容量.

动态规划

class Solution {public int findMaxForm(String[] strs, int m, int n) {if(strs == null){return 0;}int[][][] dp = new int[strs.length+1][m+1][n+1];for(int i=1;i<=strs.length;i++){int zero = 0;int one = 0;String str = strs[i-1];for (int x = 0; x < str.length(); x++){if (str.charAt(x) == '0')zero++;elseone++;}for(int j = 0;j<=m;j++){for(int k=0;k<=n;k++){if(j>=zero && k>=one){dp[i][j][k] = Math.max(dp[i-1][j][k],dp[i-1][j-zero][k-one]+1);}else{dp[i][j][k] = dp[i-1][j][k];}}}}return dp[strs.length][m][n];}
}

在这里插入图片描述

动态规划(压缩)

  • 1.确定dp数组(dp table)以及下标的含义

dp[i][j]:最多有i个0和j个1的strs的最大子集的大小为dp[i][j]。

  • 2.确定递推公式

dp[i][j] 可以由前一个strs里的字符串推导出来,strs里的字符串有zeroNum个0,oneNum个1。
dp[i][j] 就可以是 dp[i - zeroNum][j - oneNum] + 1。
然后我们在遍历的过程中,取dp[i][j]的最大值。
所以递推公式:dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);
01背包的递推公式:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
对比一下就会发现,字符串的zeroNum和oneNum相当于物品的重量(weight[i]),字符串本身的个数相当于物品的价值(value[i])。
这就是一个典型的01背包! 只不过物品的重量有了两个维度而已。

  • 3.dp数组如何初始化

因为物品价值不会是负数,初始为0,保证递推的时候dp[i][j]不会被初始值覆盖。

  • 4.确定遍历顺序

外层for循环遍历物品,内层for循环遍历背包容量且从后向前遍历!
那么本题也是,物品就是strs里的字符串,背包容量就是题目描述中的m和n。

        for(String str :strs){int zero = 0;int one = 0;for (char ch : str.toCharArray()) {if (ch == '0') {zero++;} else {one++;}}//倒序遍历for (int i = m; i >= zero; i--) {for (int j = n; j >= one; j--) {dp[i][j] = Math.max(dp[i][j], dp[i - zero][j - one] + 1);}}}
  • 5.举例推导dp数组

以输入:[“10”,“0001”,“111001”,“1”,“0”],m = 3,n = 3为例
最后dp数组的状态如下所示:

在这里插入图片描述
代码如下

class Solution {public int findMaxForm(String[] strs, int m, int n) {if(strs == null){return 0;}int[][] dp = new int[m+1][n+1];for(String str :strs){int zero = 0;int one = 0;for (char ch : str.toCharArray()) {if (ch == '0') {zero++;} else {one++;}}//倒序遍历for (int i = m; i >= zero; i--) {for (int j = n; j >= one; j--) {dp[i][j] = Math.max(dp[i][j], dp[i - zero][j - one] + 1);}}}return dp[m][n];}
}

在这里插入图片描述

相关内容

热门资讯

湘女归魂,佩环玉冷无声,凝情... “湘女归魂,佩环玉冷无声,凝情谁诉。”出处 出自 宋代 吴文英 的《过秦楼·黄钟商芙蓉》“湘女归魂,...
莫言的创作特点 莫言的创作特点  文学作品至今没有严格的评判标准,好与坏的标准是什么?如何判断一个作者的潜力?这就看...
描写龙的诗句 描写龙的诗句  应物 【龙潭】 石激悬流雪满湾,五龙潜处野云闲。  来济 【出玉关】 敛辔遵龙汉,衔...
长江与黄河的诗句 长江与黄河的诗句  优美逶迤的山岭,蜿蜒盘旋,犹如一条正在酣睡的`巨龙。俯瞰足下,白云弥漫,环观群峰...
关于边塞的诗句古诗 导语:苍茫戈壁虽有鸟飞绝,人踪灭的苍凉,也许这贫瘠而厚重的戈壁下面蕴含着丰富的宝藏,茫茫戈壁留给我的...
匈奴草黄马正肥,金山西见烟尘... “匈奴草黄马正肥,金山西见烟尘飞,汉家大将西出师。”出处 出自 唐代 岑参 的《走马川行奉送出师西征...
杜甫古诗绝句意思 杜甫古诗绝句意思  《绝句》这首诗是杜甫在成都浣花溪草堂闲居时写的,共写绝句四首,接下来由小编整理了...
倚篷窗无寐,引杯孤酌 “倚篷窗无寐,引杯孤酌。”出处 出自 宋代 张元干 的《满江红·自豫章阻风吴城山作》“倚篷窗无寐,引...
海畔尖山似剑铓,秋来处处割愁... “海畔尖山似剑铓,秋来处处割愁肠。”出处 出自 唐代 柳宗元 的《与浩初上人同看山寄京华亲故》“海畔...
于秋的诗句 有关于秋的诗句有关于秋的诗句1  1、惟有河边雁,秋来南向飞。庾信《重别周尚书》  2、戛戛秋蝉响似...
七夕的经典诗句 七夕的经典诗句  在日常的学习、工作、生活中,大家一定没少看到经典的诗句吧,不同的`诗句,其语言艺术...
李白的慈悲诗句 李白的慈悲诗句  “白也诗无敌,飘然思不群”……  一提起李白,人们首先会想起俊逸、潇洒,这些形象,...
表达思念之情诗句 表达思念之情诗句  引导语:大家知道哪些表达思念之情的诗句?下面是小编整理的.2篇,与大家分享,欢迎...
鲁迅散文的艺术特点 鲁迅散文的艺术特点  鲁迅是现代中国文学里的标志性的里程碑,他的白话文小说有如一颗巨石,沉沉地砸向当...
老舍《她那么看过我》原文及读... 老舍《她那么看过我》原文及读后感  【老舍《她那么看过我》原文】  人是为明天活着的,因为记忆中有朝...
端午节的诗句 端午节的诗句(精选60句)  在平日的学习、工作和生活里,大家一定都接触过一些使用较为普遍的诗句吧,...
菊花的诗句欣赏 菊花的诗句欣赏  那些才气四溢的诗人们,舞文弄墨,妙笔天长,将菊之美染作桃花扇底的`一抹灿烂,写作精...
劳动节的古诗 关于劳动节的古诗(精选30首)  在现实生活或工作学习中,大家对古诗都再熟悉不过了吧,古诗具有格律限...
今年元夜时,月与灯依旧 “今年元夜时,月与灯依旧。”出处 出自 宋代 欧阳修(一说朱淑真) 的《生查子·元夕》“今年元夜时,...
古风爱情诗句 古风爱情诗句(精选250句)  在现实生活或工作学习中,大家都听说过或者使用过一些比较经典的诗句吧,...