Untitled

 avatar
unknown
plain_text
16 days ago
1.5 kB
2
Indexable
import java.util.Arrays;

public class Solution {
    public int findMaxForm(String[] strs, int m, int n) {
        // Create a memoization table
        int[][][] memo = new int[strs.length][m + 1][n + 1];
        for (int[][] matrix : memo) {
            for (int[] row : matrix) {
                Arrays.fill(row, -1);
            }
        }

        return dfs(strs, 0, m, n, memo);
    }

    private int dfs(String[] strs, int index, int m, int n, int[][][] memo) {
        // Base cases
        if (index == strs.length) {
            return 0;
        }
        if (m < 0 || n < 0) {
            return Integer.MIN_VALUE; // Invalid state
        }

        // If already computed, return the cached result
        if (memo[index][m][n] != -1) {
            return memo[index][m][n];
        }

        // Count zeros and ones in the current string
        int zeros = 0, ones = 0;
        for (char c : strs[index].toCharArray()) {
            if (c == '0') zeros++;
            else ones++;
        }

        // Choice 1: Skip the current string
        int skip = dfs(strs, index + 1, m, n, memo);

        // Choice 2: Include the current string
        int include = Integer.MIN_VALUE;
        if (m >= zeros && n >= ones) {
            include = 1 + dfs(strs, index + 1, m - zeros, n - ones, memo);
        }

        // Store the result in memo and return the maximum of the two choices
        memo[index][m][n] = Math.max(skip, include);
        return memo[index][m][n];
    }
}
Editor is loading...
Leave a Comment