思路:抽象成背包问题。本题中strs 数组里的元素就是物品,每个物品都是一个。而m 和 n相当于是一个背包,两个维度的背包。
dp数组
dp[i][j]:容量为i的背包最多几个0,,容量为j的背包最多几个1.
1. 1. str["10","0001","111001","1","0"],m=5,n=3
此时元素是10,有1个1和1个0.
此时有3个0和1个1.
除去3个0和1个1后的背包还有多少空间?
dp[i-zeros][j-ones]=dp[5-3][3-1]=dp[2][2]=1,最多可以放1个。
递归公式
dp[i][j]=Math.max(dp[i-zeros][j-ones]+1,dp[i][j])
class Solution {
public int findMaxForm(String[] strs, int m, int n) {
int[][] dp=new int[m+1][n+1];
for(String s:strs){
int zeros=0;
int ones=0;
//统计0和1的值
for(char c:s.toCharArray()){
if(c=='0'){
zeros++;
}else{
ones++;
}
}
//更新dp数组
for(int i= m;i>=zeros;i--){
for(int j=n;j>=ones;j--){
dp[i][j]=Math.max(dp[i-zeros][j-ones]+1, dp[i][j]);
}
}
}
return dp[m][n];
}
}