我正在研究在leetcode上找到的这个问题的解决方案。
问题指出:
给定一个数组 ,其字符串仅由0和1
strs
组成。还有两个整数和。m
n
m
现在你的任务是找到给定的0 和n
1可以组成的最大字符串数。每个0和1最多只能使用一次。
输入:
strs = ["10","0001","111001","1","0"]
,m = 5
,n = 3
输出:
4
解释:用5个0和3个1可以组成4个字符串,分别是“10”、“0001”、“1”、“0”。
用于解决该问题的算法如下:
def findMaxForm(strs, m, n):
dp = [[0] * (n + 1) for _ in range(m +1)]
for s in strs:
zeros, ones = s.count('0'), s.count('1')
for i in range(m, zeros - 1, -1):
for j in range(n, ones -1, - 1):
# dp[i][j] indicates it has i zeros ans j ones,
# can this string be formed with those ?
dp[i][j] = max( 1 + dp[i - zeros][j - ones], dp[i][j])
# print(dp)
return dp[-1][-1]
问题的混乱部分是dp[i][j] = max( 1 + dp[i - zeros][j - ones], dp[i][j])
. 我不确定这里发生了什么。为什么我们从 0 中减去 i,从 1 中减去 j?
我还找到了一张图表,解释了 dp 表应该如何查找数组中的所有元素。
我的问题:
第一张表代表什么?x 和 y 轴?为什么有这么多1
的。我想如果我理解了这一部分,可能会有所作为。如果有人浏览图表,我将不胜感激
为什么这种方式给了我们可以形成的最大数量的0
'和1
'?我想我对这部分仍然感到困惑dp[i][j] = max( 1 + dp[i - zeros][j - ones], dp[i][j])
。
该解决方案还被描述为“针对 2D 空间优化的 3d-DP:dp[j][k]:i 维度经过优化以就地使用。” 这意味着什么?
HUWWW
相关分类