首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

2024-03-27:用go语言,多维费用背包。 给你一个二进制字符串数组 strs 和两个整数 m 和 n, 请你找出并返回

2024-03-27:用go语言,多维费用背包。

给你一个二进制字符串数组 strs 和两个整数 m 和 n,

请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1。

如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集。

输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3。

输出:4。

答案2024-03-27:

来自左程云。

灵捷3.5

大体步骤如下:

1.findMaxForm1函数使用递归的方式实现。它遍历字符串数组strs,将每个字符串中0和1的数量存储在一个二维数组arr中。然后通过递归函数process1进行计算,不断比较所选字符串是否符合要求,选择放入或不放入子集。该方法的时间复杂度为O(2^n),空间复杂度为O(n)。

2.findMaxForm2函数使用记忆化搜索的方式实现。它也遍历字符串数组strs得到二维数组arr,但使用三维数组dp进行记忆化,记录已经计算过的结果,避免重复计算。该方法的时间复杂度为O(m * n * len(strs)),空间复杂度为O(m * n * len(strs))。

3.findMaxForm3函数使用动态规划的方式实现。它从后向前遍历字符串数组strs,得到二维数组dp来保存计算结果。通过比较选择当前字符串加入子集还是不加入子集,并更新动态规划数组dp。该方法的时间复杂度为O(m * n * len(strs)),空间复杂度为O(m * n * len(strs))。

4findMaxForm4函数使用动态规划的方式实现。它遍历字符串数组strs,得到二维数组dp来保存计算结果。使用一维数组dp进行滚动更新,从后向前遍历,根据当前字符串的0和1的数量,更新动态规划数组dp。该方法的时间复杂度为O(m * n * len(strs)),空间复杂度为O(m * n)。

总时间复杂度:O(m * n * len(strs))

总额外空间复杂度:O(m * n * len(strs))

Go完整代码如下:

package main

import (

"fmt"

)

var zeros, ones int

func findMaxForm1(strs []string, m int, n int) int {

len := len(strs)

arr := make([][]int, len)

for i := 0; i < len; i++ {

zeroAndOne(strs[i])

arr[i] = []int{zeros, ones}

}

return process1(arr, 0, m, n)

}

func process1(arr [][]int, i int, z int, o int) int {

if i == len(arr) {

return 0

}

p1 := process1(arr, i+1, z, o)

p2 := 0

if arr[i][0] <= z && arr[i][1] <= o {

p2 = 1 + process1(arr, i+1, z-arr[i][0], o-arr[i][1])

}

if p1 > p2 {

return p1

}

return p2

}

func findMaxForm2(strs []string, m int, n int) int {

len := len(strs)

arr := make([][]int, len)

for i := 0; i < len; i++ {

zeroAndOne(strs[i])

arr[i] = []int{zeros, ones}

}

dp := make([][][]int, len)

for i := 0; i < len; i++ {

dp[i] = make([][]int, m+1)

for j := 0; j <= m; j++ {

dp[i][j] = make([]int, n+1)

for k := 0; k <= n; k++ {

dp[i][j][k] = -1

}

}

}

return process2(arr, 0, m, n, dp)

}

func process2(arr [][]int, i int, z int, o int, dp [][][]int) int {

if i == len(arr) {

return 0

}

if dp[i][z][o] != -1 {

return dp[i][z][o]

}

p1 := process2(arr, i+1, z, o, dp)

p2 := 0

if arr[i][0] <= z && arr[i][1] <= o {

p2 = 1 + process2(arr, i+1, z-arr[i][0], o-arr[i][1], dp)

}

ans := p1

if p2 > p1 {

ans = p2

}

dp[i][z][o] = ans

return ans

}

func findMaxForm3(strs []string, m int, n int) int {

len0 := len(strs)

dp := make([][][]int, len0+1)

for i := len0; i >= 0; i-- {

dp[i] = make([][]int, m+1)

for z := 0; z <= m; z++ {

dp[i][z] = make([]int, n+1)

}

}

for i := len0 - 1; i >= 0; i-- {

zeroAndOne(strs[i])

for z := 0; z <= m; z++ {

for o := 0; o <= n; o++ {

dp[i][z][o] = dp[i+1][z][o]

if zeros <= z && ones <= o {

dp[i][z][o] = max(dp[i][z][o], 1+dp[i+1][z-zeros][o-ones])

}

}

}

}

return dp[0][m][n]

}

func zeroAndOne(str string) {

zeros = 0

ones = 0

for i := 0; i < len(str); i++ {

if str[i] == '0' {

zeros++

} else {

ones++

}

}

}

func findMaxForm4(strs []string, m int, n int) int {

dp := make([][]int, m+1)

for i := 0; i <= m; i++ {

dp[i] = make([]int, n+1)

}

for _, s := range strs {

zeroAndOne(s)

for i := m; i >= zeros; i-- {

for j := n; j >= ones; j-- {

dp[i][j] = max(dp[i][j], dp[i-zeros][j-ones]+1)

}

}

}

return dp[m][n]

}

func max(a, b int) int {

if a > b {

return a

}

return b

}

func main() {

strs := []string{"10", "0001", "111001", "1", "0"}

m := 5

n := 3

res1 := findMaxForm1(strs, m, n)

fmt.Println("findMaxForm1:", res1)

res2 := findMaxForm2(strs, m, n)

fmt.Println("findMaxForm2:", res2)

res3 := findMaxForm3(strs, m, n)

fmt.Println("findMaxForm3:", res3)

res4 := findMaxForm4(strs, m, n)

fmt.Println("findMaxForm4:", res4)

}

在这里插入图片描述Python完整代码如下:

# -*-coding:utf-8-*-

def zero_and_one(string):

zeros = 0

ones = 0

for char in string:

if char == '0':

zeros += 1

else:

ones += 1

return zeros, ones

def find_max_form1(strs, m, n):

length = len(strs)

arr = []

for i in range(length):

zeros, ones = zero_and_one(strs[i])

arr.append((zeros, ones))

return process1(arr, 0, m, n)

def process1(arr, i, z, o):

if i == len(arr):

return 0

p1 = process1(arr, i+1, z, o)

p2 = 0

if arr[i][0] <= z and arr[i][1] <= o:

p2 = 1 + process1(arr, i+1, z-arr[i][0], o-arr[i][1])

if p1 > p2:

return p1

return p2

def find_max_form2(strs, m, n):

length = len(strs)

arr = []

for i in range(length):

zeros, ones = zero_and_one(strs[i])

arr.append((zeros, ones))

dp = [[[-1] * (n+1) for _ in range(m+1)] for _ in range(length)]

return process2(arr, 0, m, n, dp)

def process2(arr, i, z, o, dp):

if i == len(arr):

return 0

if dp[i][z][o] != -1:

return dp[i][z][o]

p1 = process2(arr, i+1, z, o, dp)

p2 = 0

if arr[i][0] <= z and arr[i][1] <= o:

p2 = 1 + process2(arr, i+1, z-arr[i][0], o-arr[i][1], dp)

ans = p1

if p2 > p1:

ans = p2

dp[i][z][o] = ans

return ans

def find_max_form3(strs, m, n):

length = len(strs)

dp = [[[0] * (n+1) for _ in range(m+1)] for _ in range(length+1)]

for i in range(length-1, -1, -1):

zeros, ones = zero_and_one(strs[i])

for z in range(m+1):

for o in range(n+1):

dp[i][z][o] = dp[i+1][z][o]

if zeros <= z and ones <= o:

dp[i][z][o] = max(dp[i][z][o], 1 + dp[i+1][z-zeros][o-ones])

return dp[0][m][n]

def find_max_form4(strs, m, n):

dp = [[0] * (n+1) for _ in range(m+1)]

for s in strs:

zeros, ones = zero_and_one(s)

for i in range(m, zeros-1, -1):

for j in range(n, ones-1, -1):

dp[i][j] = max(dp[i][j], dp[i-zeros][j-ones]+1)

return dp[m][n]

strs = ["10", "0001", "111001", "1", "0"]

m = 5

n = 3

res1 = find_max_form1(strs, m, n)

print("findMaxForm1:", res1)

res2 = find_max_form2(strs, m, n)

print("findMaxForm2:", res2)

res3 = find_max_form3(strs, m, n)

print("findMaxForm3:", res3)

res4 = find_max_form4(strs, m, n)

print("findMaxForm4:", res4)

在这里插入图片描述

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OqvnceQCDDy1gLQA2mH7OxvA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券