-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy path11_Ones_and_Zeroes.cpp
More file actions
62 lines (48 loc) · 1.65 KB
/
Copy path11_Ones_and_Zeroes.cpp
File metadata and controls
62 lines (48 loc) · 1.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// 474. Ones and Zeroes
// You are given an array of binary strings strs and two integers m and n.
// Return the size of the largest subset of strs such that there are at most m 0's and n 1's in the subset.
// A set x is a subset of a set y if all elements of x are also elements of y.
// Example 1:
// Input: strs = ["10","0001","111001","1","0"], m = 5, n = 3
// Output: 4
// Explanation: The largest subset with at most 5 0's and 3 1's is {"10", "0001", "1", "0"}, so the answer is 4.
// Other valid but smaller subsets include {"0001", "1"} and {"10", "1", "0"}.
// {"111001"} is an invalid subset because it contains 4 1's, greater than the maximum of 3.
// Example 2:
// Input: strs = ["10","0","1"], m = 1, n = 1
// Output: 2
// Explanation: The largest subset is {"0", "1"}, so the answer is 2.
// Constraints:
// 1 <= strs.length <= 600
// 1 <= strs[i].length <= 100
// strs[i] consists only of digits '0' and '1'.
// 1 <= m, n <= 100
class Solution
{
public:
vector<int> counting(string s)
{
vector<int> count(2, 0);
for (auto &c : s)
{
count[c - '0']++;
}
return count;
}
int findMaxForm(vector<string> &strs, int m, int n)
{
vector<vector<int>> dp(m + 1, vector<int>(n + 1));
for (auto &s : strs)
{
vector<int> count = counting(s);
for (int zero = m; zero >= count[0]; zero--)
{
for (int one = n; one >= count[1]; one--)
{
dp[zero][one] = max(dp[zero - count[0]][one - count[1]] + 1, dp[zero][one]);
}
}
}
return dp[m][n];
}
};