474. 一和零

给你一个二进制字符串数组 strs 和两个整数 mn
请你找出并返回 strs 的最大子集的大小,该子集中 最多m0n1
如果 x 的所有元素也是 y 的元素,集合 x 是集合 y子集

示例 1:
输入:strs = [“10”, “0001”, “111001”, “1”, “0”], m = 5, n = 3
输出:4
解释:最多有 5 个 0 和 3 个 1 的最大子集是 {“10”,”0001”,”1”,”0”} ,因此答案是 4 。
其他满足题意但较小的子集包括 {“0001”,”1”} 和 {“10”,”1”,”0”} 。{“111001”} 不满足题意,因为它含 4 个 1 ,大于 n 的值 3 。

  1. //三维dp,01🎒,时间 lmn ;空间 lmn
  2. func findMaxForm(strs []string, m int, n int) int {
  3. l := len(strs)
  4. dp := make([][][]int, l +1)
  5. for k := range dp {
  6. dp[k] = make([][]int, m +1)
  7. for k1 := range dp[k] {
  8. dp[k][k1] = make([]int, n +1)
  9. }
  10. }
  11. for i := 1; i <= l; i++ {
  12. count := countZeroAndOne(strs[i-1]) //新的函数,用来判断数组的数字个数
  13. for j := 0; j <= m; j++ {
  14. for k := 0; k <= n; k++ {
  15. if count[0] > j || count[1] > k {
  16. dp[i][j][k] = dp[i-1][j][k] //不装包,超容量了
  17. } else {
  18. dp[i][j][k] = max(dp[i-1][j][k], dp[i-1][j- count[0]][k- count[1]] +1)
  19. }
  20. }
  21. }
  22. }
  23. return dp[l][m][n]
  24. }
  25. func countZeroAndOne(s string) []int {
  26. c := make([]int, 2)
  27. for i := 0; i < len(s); i++ {
  28. c[s[i]-'0']++
  29. }
  30. return c
  31. }
  32. func max(a, b int) int {
  33. if a > b {
  34. return a
  35. }
  36. return b
  37. }
////压缩二维数组 ,01🎒,时间 lmn ;空间 mn
func findMaxForm(strs []string, m int, n int) int {
    l := len(strs)
    dp := make([][]int, m+1)

    for k := range dp {
        dp[k] = make([]int, n+1)
    }


    for i := 1; i <= l; i++ {
        count := countZeroAndOne(strs[i-1])

        for j := m; j >= 0; j-- {                    // 为了不覆盖需要用到的上一层的状态值
            for k := n; k >= 0; k-- {
                if count[0] > j || count[1] > k {
                    dp[j][k] = dp[j][k]
                } else {
                    dp[j][k] = max(dp[j][k], dp[j-count[0]][k-count[1]]+1)
                }
            }
        }
    }
    return dp[m][n]
}

func countZeroAndOne(s string) []int {
    c := make([]int, 2)
    for i := 0; i < len(s); i++ {
        c[s[i]-'0']++
    }
    return c
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}