474.Ones and Zeroes
题目描述:In the computer world, use restricted resource you have to generate maximum benefit is what we always want to pursue.
For now, suppose you are a dominator of m
0s
and n1s
respectively. On the other hand, there is an array with strings consisting of only0s
and1s
.Now your task is to find the maximum number of strings that you can form with given m
0s
and n1s
. Each0
and1
can be used at most once.Note:
- The given numbers of
0s
and1s
will both not exceed100
- The size of given string array won’t exceed
600
.
- The given numbers of
Example 1:
Input: Array = {"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: Array = {"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".
题目大意:给定一个只包含0与1的字符数组array,给定m表述0最多出现的次数,给定n表示1最多出现的次数,问在给定的m与n的范围内,可以从array中选出的最多字符的个数。
思路:DP,0,1背包的变种,dp[i][j]表示m为i,n为j能找出的最多字符串的个数。
代码
package DP; /** * @author OovEver * 2017/12/25 9:59 */ public class LeetCode474 { public int findMaxForm(String[] strs, int m, int n) { int[][] dp = new int[m + 1][n + 1]; for (String s : strs) { int[] count = count(s); for(int i=m;i>=count[0];i--) { for(int j=n;j>=count[1];j--) { dp[i][j] = Math.max(dp[i][j], 1 + dp[i - count[0]][j - count[1]]); } } } return dp[m][n]; } /** * 统计s中0与1的数量 * @param s 要统计的字符串 * @return 字符串中0与1的数量 */ private int[] count(String s) { int[] res = new int[2]; for(int i=0;i<s.length();i++) { res[s.charAt(i) - '0']++; } return res; } }