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".
DP求解,定义一个二维数组,int[][] dp = new int[m+1][n+1],其中dp[i][j]表示i个0和j个1能表示字符串的最大个数,假设当前字符串有a个0,b个1,则有dp[i][j] = Math.max(dp[i][j], dp[i-a][j-b]),因此程序如下所示:
class Solution {
public int findMaxForm(String[] strs, int m, int n) {
int[][] dp = new int[m+1][n+1];
for (String s : strs){
int zeros = 0, ones = 0;
int len = s.length();
for (int i = 0; i < len; ++ i){
if (s.charAt(i) == '0'){
zeros ++;
}
else {
ones ++;
}
}
for (int i = m; i >= zeros; -- i){
for (int j = n; j >= ones; -- j){
dp[i][j] = Math.max(dp[i][j], dp[i-zeros][j-ones] + 1);
}
}
}
return dp[m][n];
}
}