LeetCode 474. Ones and Zeroes
原题链接在这里:https://leetcode.com/problems/ones-and-zeroes/description/
题目:
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 m 0s
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最多能包含几个给出的string. Let dp[i][j] denotes i 0s 和 j 1s 最多能包含几个string.
For each s, s中有x个0和y个1. If take s, 那么dp[i][j] = 1 + dp[i-x][j-y]. 若不包含s, dp[i][j] = dp[i][j]. 两者取较大值.
Since update needs dp[i-x][j-y] from the last iteration. Thus iterate i and j from big to small.
答案dp[m][n].
Time Complexity: O(strs.length*(average + m*n)). average is average length of strs.
Space: O(1).
AC Java:
1 class Solution { 2 public int findMaxForm(String[] strs, int m, int n) { 3 if(strs == null || strs.length == 0 || m < 0 || n < 0){ 4 return 0; 5 } 6 7 int [][] dp = new int[m+1][n+1]; 8 for(String s : strs){ 9 int [] count = countZerosOnes(s); 10 for(int i = m; i>=count[0]; i--){ 11 for(int j = n; j>=count[1]; j--){ 12 dp[i][j] = Math.max(dp[i][j], 1+dp[i-count[0]][j-count[1]]); 13 } 14 } 15 } 16 return dp[m][n]; 17 } 18 19 private int [] countZerosOnes(String s){ 20 int [] res = new int[2]; 21 for(int i = 0; i<s.length(); i++){ 22 res[s.charAt(i)-'0']++; 23 } 24 return res; 25 } 26 }