474. Ones and Zeroes

粽子包子粿條發表於2020-10-14

Given an array, strs, with strings consisting of only 0s and 1s. Also two integers m and n.

Now your task is to find the maximum number of strings that you can form with given m 0s and n 1s. Each 0 and 1 can be used at most once.

 

Example 1:

Input: strs = ["10","0001","111001","1","0"], m = 5, n = 3
Output: 4
Explanation: This are totally 4 strings can be formed by the using of 5 0s and 3 1s, which are "10","0001","1","0".
Example 2:

Input: strs = ["10","0","1"], m = 1, n = 1
Output: 2
Explanation: You could form "10", but then you'd have nothing left. Better form "0" and "1".
 

Constraints:

1 <= strs.length <= 600
1 <= strs[i].length <= 100
strs[i] consists only of digits '0' and '1'.
1 <= m, n <= 100

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/ones-and-zeroes
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

動態規劃,dp[i][j]表示i個0和j個1最多能放多少個字串。

因為字串只能用一次,所以i和j從大到小遍歷。

class Solution {
    public int findMaxForm(String[] strs, int m, int n) {
        int [][]dp = new int[m + 1][n + 1];
        int []zero = new int[strs.length];
        int []one = new int[strs.length];
        for (int i = 0; i < strs.length; i++) {
            for (int j = 0; j < strs[i].length(); j++) {
                if (strs[i].charAt(j) == '0') {
                    zero[i]++;
                } else {
                    one[i]++;
                }
            }
        }
        for (int k = 0; k < strs.length; k++) {
            for (int i = m; i >= 0; i--) {
                for (int j = n; j >= 0; j--) {
                    if (i >= zero[k] && j >= one[k]){
                        dp[i][j] = Math.max(dp[i][j], dp[i - zero[k]][j - one[k]] + 1);
                    }
                }
            }
        }
        return dp[m][n];
    }
}

 

相關文章