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
SOLUTION:
class Solution:
    def longest(self, strs, i, m, n, slen):
        if m < 0 or n < 0:
            return -1
        if i >= slen:
            return 0
        key = (i, m, n)
        if key in self.cache:
            return self.cache[key]
        x, y = strs[i]
        a = 1 + self.longest(strs, i + 1, m - x, n - y, slen)
        b = self.longest(strs, i + 1, m, n, slen)
        mlen = max(a, b)
        self.cache[key] = mlen
        return mlen
    
    def findMaxForm(self, strs: List[str], m: int, n: int) -> int:
        slen = len(strs)
        strs = [(s.count("0"), s.count("1")) for s in strs]
        self.cache = {}
        return self.longest(strs, 0, m, n, slen)

Comments

Popular posts from this blog

Minimum Number of Operations to Move All Balls to Each Box

Efficient Generation of Nth Row of Binomial Coefficient Modulo M

Power of Two Difference