Suppose we have a list of strings where each string contains two letters "A"s and "B"s. We have two values a and b. We have to find the maximum number of strings that can be formed. We can use at most a number of "A"s and at most b number of "B"s, without reuse.
So, if the input is like strings = ["AAABB", "AABB", "AA", "BB"] a = 4 b = 2, then the output will be 2, as we can take the strings using 4 "A"s and 2 "B"s ["AABB","AA"].
To solve this, we will follow these steps −
- pairs := a new list
- for each w in strings, do
- A := number of "A" in w
- B := size of w - A
- insert a pair (A, B) at the end of pairs
- ans := a map where (a, b) has value 0
- for each pait (A, B) in pairs, do
- temp := a new map from ans
- for each pair (temp_a, temp_b), and value wc of ans, do
- if temp_a >= A and temp_b >= B, then
- rem := a pait (temp_a - A, temp_b - B)
- temp[rem] := maximum of temp[rem] (if rem is not there, 0) and (wc + 1)
- ans := temp
- if temp_a >= A and temp_b >= B, then
- return maximum of list of all values of ans
Let us see the following implementation to get better understanding −
Example
class Solution: def solve(self, strings, a, b): pairs = [] for w in strings: A = w.count("A") B = len(w) - A pairs.append((A, B)) ans = {(a, b): 0} for A, B in pairs: temp = dict(ans) for (temp_a, temp_b), wc in ans.items(): if temp_a >= A and temp_b >= B: rem = (temp_a - A, temp_b - B) temp[rem] = max(temp.get(rem, 0), wc + 1) ans = temp return max(ans.values()) ob = Solution() strings = ["AAABB", "AABB", "AA", "BB"] a = 4 b = 2 print(ob.solve(strings, a, b))
Input
["AAABB", "AABB", "AA", "BB"], 4, 2
Output
2