In the computer world,use restricted resource you have to generate maximum benefit is what we always want to pursue.
For Now,suppose you are a dominator of m0s
and n 1s
respectively. On the other hand,there is an array with strings consisting of only 0s
and 1s
.
Now your task is to find the maximum number of strings that you can form with given m 0s
and n 1s
. Each 0
and 1
can be used at most once.
Note:
- The given numbers of
0s
and1s
will both not exceed100
- The size of given string array won‘t exceed
600
.
Example 1:
Input: Array = {"10","0001","111001","1","0"},m = 5,n = 3 Output: 4 Explanation: This are totally 4 strings can be formed by the using of 5 0s and 3 1s,which are “10,”0001”,”1”,”0”
Example 2:
Input: Array = {"10","0","1"},m = 1,n = 1 Output: 2 Explanation: You Could form "10",but then you‘d have nothing left. Better form "0" and "1".
在计算机界中,我们总是追求用有限的资源获取最大的收益。
现在,假设你分别支配着 m 个 0
和 n 个 1
。另外,还有一个仅包含 0
和 1
字符串的数组。
你的任务是使用给定的 m 个 0
和 n 个 1
,找到能拼出存在于数组中的字符串的最大数量。每个 0
和 1
至多被使用一次。
注意:
- 给定
0
和1
的数量都不会超过100
。 - 给定字符串数组的长度不会超过
600
。
示例 1:
输入: Array = {"10",n = 3 输出: 4 解释: 总共 4 个字符串可以通过 5 个 0 和 3 个 1 拼出,即 "10","0" 。
示例 2:
输入: Array = {"10",n = 1 输出: 2 解释: 你可以拼出 "10",但之后就没有剩余数字了。更好的选择是拼出 "0" 和 "1" 。
Runtime: 4936 ms
Memory Usage: 4.1 MB
1 class Solution { 2 func findMaxForm(_ strs: [String],_ m: Int,_ n: Int) -> Int { 3 var dp:[[Int]] = [[Int]](repeating:[Int](repeating:0,count:n + 1),count:m + 1) 4 for str in strs 5 { 6 var zeros:Int = 0 7 var ones:Int = 0 8 for c in str.characters 9 { 10 if c == "0" 11 { 12 zeros += 1 13 } 14 else 15 { 16 ones += 1 17 } 18 } 19 if zeros <= m && ones <= n 20 { 21 for i in (zeros...m).reversed() 22 { 23 for j in (ones...n).reversed() 24 { 25 //递推公式 26 dp[i][j] = max(dp[i][j],dp[i - zeros][j - ones] + 1) 27 } 28 } 29 } 30 } 31 return dp[m][n] 32 } 33 }
105934 kb
1 class Solution { 2 func findMaxForm(_ strs: [String],_ n: Int) -> Int { 3 let l = strs.count 4 var dp: [[[Int]]] = Array(repeating: Array(repeating: Array(repeating:0,count: n + 1),count: m + 1),count: l + 1) 5 for i in 0 ... l { 6 let counts = i == 0 ? (0,0) : getCounts(strs[i - 1]) 7 for j in 0 ... m { 8 for k in 0 ... n { 9 if i == 0 { 10 dp[i][j][k] = 0 11 } else if j >= counts.0 && k >= counts.1 { 12 dp[i][j][k] = max(dp[i - 1][j][k],dp[i - 1][j - counts.0][k - counts.1] + 1) 13 } else { 14 dp[i][j][k] = dp[i - 1][j][k] 15 } 16 } 17 } 18 } 19 return dp[l][m][n] 20 } 21 22 private func getCounts(_ str: String) -> (Int,Int) { 23 let s = Array(str) 24 var zeroCount = 0 25 s.forEach { 26 if $0 == "0" { 27 zeroCount += 1 28 } 29 } 30 return (zeroCount,s.count - zeroCount) 31 } 32 }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。