1. Recursive Inclusion / Exclusion
Intuition
Recursively decide whether to include or exclude each string while checking budget constraints.
Algorithm
- Define
solve(idx, remM, remN). - If
idx == S, return 0. - Option 1: Exclude string:
solve(idx + 1, remM, remN). - Option 2: Include string (if
count0 <= remM && count1 <= remN):1 + solve(idx + 1, remM - count0, remN - count1). - Return
max(Option 1, Option 2).
#include <iostream>#include <vector>#include <string>#include <algorithm> using namespace std; class Solution { int solve(int idx, int m, int n, const vector<pair<int, int>>& items) { if (idx == items.size()) return 0; int notTake = solve(idx + 1, m, n, items); int take = 0; if (m >= items[idx].first && n >= items[idx].second) { take = 1 + solve(idx + 1, m - items[idx].first, n - items[idx].second, items); } return max(notTake, take); }public: int findMaxForm(vector<string>& strs, int m, int n) { vector<pair<int, int>> items; for (const string& s : strs) { int z = 0, o = 0; for (char c : s) { if (c == '0') z++; else o++; } items.push_back({z, o}); } return solve(0, m, n, items); }}; int main() { Solution sol; vector<string> strs = {"10", "0001", "111001", "1", "0"}; cout << "Max Form: " << sol.findMaxForm(strs, 5, 3) << endl; return 0;}Time & Space Complexity
- Time complexity:
O(2^S) - Space complexity:
O(S) call stack