@@ -47,13 +47,131 @@ Other valid but smaller subsets include {"0001", "1"} and {&
47
47
### ** Python3**
48
48
49
49
``` python
50
+ class Solution :
51
+ def findMaxForm (self , strs : List[str ], m : int , n : int ) -> int :
52
+ l = len (strs)
53
+ dp = [[[0 ] * (n + 1 ) for i in range (m + 1 )] for j in range (l)]
54
+ t = [(s.count(' 0' ), s.count(' 1' )) for s in strs]
55
+ n0, n1 = t[0 ]
56
+ for j in range (m + 1 ):
57
+ for k in range (n + 1 ):
58
+ if n0 <= j and n1 <= k:
59
+ dp[0 ][j][k] = 1
60
+
61
+ for i in range (1 , l):
62
+ n0, n1 = t[i]
63
+ for j in range (m + 1 ):
64
+ for k in range (n + 1 ):
65
+ dp[i][j][k] = dp[i - 1 ][j][k]
66
+ if n0 <= j and n1 <= k:
67
+ dp[i][j][k] = max (dp[i][j][k], dp[i - 1 ][j - n0][k - n1] + 1 )
68
+
69
+ return dp[- 1 ][- 1 ][- 1 ]
70
+ ```
50
71
72
+ ``` python
73
+ class Solution :
74
+ def findMaxForm (self , strs : List[str ], m : int , n : int ) -> int :
75
+ dp = [[0 ] * (n + 1 ) for _ in range (m + 1 )]
76
+ t = [(s.count(' 0' ), s.count(' 1' )) for s in strs]
77
+ for k in range (len (strs)):
78
+ n0, n1 = t[k]
79
+ for i in range (m, n0 - 1 , - 1 ):
80
+ for j in range (n, n1 - 1 , - 1 ):
81
+ dp[i][j] = max (dp[i][j], dp[i - n0][j - n1] + 1 )
82
+ return dp[- 1 ][- 1 ]
51
83
```
52
84
53
85
### ** Java**
54
86
55
87
``` java
88
+ class Solution {
89
+ public int findMaxForm (String [] strs , int m , int n ) {
90
+ int [][] dp = new int [m + 1 ][n + 1 ];
91
+ for (String s : strs) {
92
+ int [] t = count(s);
93
+ for (int i = m; i >= t[0 ]; -- i) {
94
+ for (int j = n; j >= t[1 ]; -- j) {
95
+ dp[i][j] = Math . max(dp[i][j], dp[i - t[0 ]][j - t[1 ]] + 1 );
96
+ }
97
+ }
98
+ }
99
+ return dp[m][n];
100
+ }
101
+
102
+ private int [] count (String s ) {
103
+ int n0 = 0 ;
104
+ for (char c : s. toCharArray()) {
105
+ if (c == ' 0' ) {
106
+ ++ n0;
107
+ }
108
+ }
109
+ return new int []{n0, s. length() - n0};
110
+ }
111
+ }
112
+ ```
113
+
114
+ ### ** C++**
115
+
116
+ ``` cpp
117
+ class Solution {
118
+ public:
119
+ int findMaxForm(vector<string >& strs, int m, int n) {
120
+ vector<vector<int >> dp(m + 1, vector<int >(n + 1));
121
+ for (auto s : strs)
122
+ {
123
+ vector<int > t = count(s);
124
+ for (int i = m; i >= t[ 0] ; --i)
125
+ for (int j = n; j >= t[ 1] ; --j)
126
+ dp[ i] [ j ] = max(dp[ i] [ j ] , dp[ i - t[ 0]] [ j - t[ 1]] + 1);
127
+ }
128
+ return dp[ m] [ n ] ;
129
+ }
130
+
131
+ vector<int> count(string s) {
132
+ int n0 = 0;
133
+ for (char c : s)
134
+ if (c == '0') ++n0;
135
+ return {n0, (int) s.size() - n0};
136
+ }
137
+ };
138
+ ```
56
139
140
+ ### ** Go**
141
+
142
+ ``` go
143
+ func findMaxForm (strs []string , m int , n int ) int {
144
+ dp := make ([][]int , m+1 )
145
+ for i := 0 ; i < m+1 ; i++ {
146
+ dp[i] = make ([]int , n+1 )
147
+ }
148
+ for _ , s := range strs {
149
+ t := count (s)
150
+ for i := m; i >= t[0 ]; i-- {
151
+ for j := n; j >= t[1 ]; j-- {
152
+ dp[i][j] = max (dp[i][j], dp[i-t[0 ]][j-t[1 ]]+1 )
153
+ }
154
+ }
155
+ }
156
+ return dp[m][n]
157
+ }
158
+
159
+ func count (s string ) []int {
160
+ n0 := 0
161
+ for i := 0 ; i < len (s); i++ {
162
+ if s[i] == ' 0' {
163
+ n0++
164
+ }
165
+ }
166
+ return []int {n0, len (s) - n0}
167
+ }
168
+
169
+ func max (a , b int ) int {
170
+ if a > b {
171
+ return a
172
+ }
173
+ return b
174
+ }
57
175
```
58
176
59
177
### ** ...**
0 commit comments