56. 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.

Solution: (Recursion)

class Solution
{
public:
    int countChar(string &s, char ch)
    {
        int count = 0;
        for (int i = 0; i < s.length(); i++)
        {
            if (s[i] == ch)
            {
                count++;
            }
        }
        return count;
    }

    int findMax(vector<string> &strs, int m, int n, int pos)
    {

        if (pos >= strs.size())
        {
            return 0;
        }

        string k = strs[pos];
        int c1 = countChar(k, '1');
        int c0 = countChar(k, '0');

        int inc = 0, exc = 0;

        if (c1 <= n && c0 <= m)
        {
            inc = 1 + findMax(strs, m - c0, n - c1, pos + 1);
        }

        exc = findMax(strs, m, n, pos + 1);
        return max(inc, exc);
    }

    int findMaxForm(vector<string> &strs, int m, int n)
    {
        int sz = strs.size();

        return findMax(strs, m, n, 0);
    }
};

Solution: (Memonization)

Solution: (DP)

Last updated

Was this helpful?