题目:
给你一个二进制字符串数组 strs 和两个整数 m 和 n 。
请你找出并返回 strs 的最大子集的大小,该子集中 最多 有 m 个 0 和 n 个 1 。
如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。
思路:
动态规划,类似0-1背包问题。
选择:每个字符串,要么选,要么不选
状态:0和1的个数
定义:dp[i][j]:使用i个0和j个1,最多能拼出的字符串数目。
初始:皆为0
解答:
class Solution:
def findMaxForm(self, strs: List[str], m: int, n: int) -> int:
if len(strs)==0:
return 0
#dp[i][j]:使用 i 个 0 和 j 个 1,最多能拼出的字符串数目
dp=[[0 for _ in range(n+1)] for _ in range(m+1)]
for str in strs:
zeros=str.count('0')
ones=str.count('1')
for i in range(m,zeros-1,-1):
for j in range(n,ones-1,-1):
dp[i][j]=max(1+dp[i-zeros][j-ones],dp[i][j])
return dp[m][n]