474. Ones and Zeroes
- Total Accepted: 10055
- Total Submissions: 26354
- Difficulty: Medium
- Contributors:
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".
Subscribe to see which companies asked this question.
思路:
使用二维数组mn来记录组成i个'0'和j个'1'的最大元素个数,因为要求的是m个'0'和n个'1',所以mn的边界可定为m和n,由此可得mn(i,j)= max(mn(i,j),mn(i - n0,j - n1),其中n0和n1分别为字符串数组中某个元素的'0'个数和'1'个数,对每个元素进行从n0到m、n1到n的mn的更新,这样最后的mn(m,n)就是所求的结果。
代码:
class Solution {
public:
int findMaxForm(vector
& strs, int m, int n) {
int size = strs.size();
vector
> mn(m + 1, vector
(n + 1, 0));
int n0 = 0;
int n1 = 0;
for(int i = 0; i < size; i ++){
int size1 = strs[i].size();
for(int j = 0; j < size1; j ++){
if(strs[i][j] == '0') n0 ++;
if(strs[i][j] == '1') n1 ++;
}
for(int k = m; k >= n0; k --){
for(int l = n; l >= n1; l --){
mn[k][l] = max(mn[k][l], mn[k- n0][l - n1] + 1);
}
}
n0 = n1 = 0;
}
return mn[m][n];
}
};