File tree Expand file tree Collapse file tree 4 files changed +251
-0
lines changed
solution/1800-1899/1898.Maximum Number of Removable Characters Expand file tree Collapse file tree 4 files changed +251
-0
lines changed Original file line number Diff line number Diff line change @@ -337,6 +337,93 @@ impl Solution {
337
337
}
338
338
```
339
339
340
+ #### JavaScript
341
+
342
+ ``` js
343
+ /**
344
+ * @param {string} s
345
+ * @param {string} p
346
+ * @param {number[]} removable
347
+ * @return {number}
348
+ */
349
+ function maximumRemovals (s , p , removable ) {
350
+ const str_len = s .length ;
351
+ const sub_len = p .length ;
352
+
353
+ /**
354
+ * @param {number} k
355
+ * @return {boolean}
356
+ */
357
+ function isSub (k ) {
358
+ const removed = new Set (removable .slice (0 , k));
359
+
360
+ let sub_i = 0 ;
361
+ for (let str_i = 0 ; str_i < str_len; ++ str_i) {
362
+ if (s .charAt (str_i) === p .charAt (sub_i) && ! removed .has (str_i)) {
363
+ ++ sub_i;
364
+ if (sub_i >= sub_len) {
365
+ break ;
366
+ }
367
+ }
368
+ }
369
+ return sub_i === sub_len;
370
+ }
371
+
372
+ let left = 0 ;
373
+ let right = removable .length ;
374
+
375
+ while (left < right) {
376
+ const middle = (left + right) >> 1 ;
377
+ if (isSub (middle + 1 )) {
378
+ left = middle + 1 ;
379
+ } else {
380
+ right = middle;
381
+ }
382
+ }
383
+ return left;
384
+ }
385
+ ```
386
+
387
+ #### Kotlin
388
+
389
+ ``` kotlin
390
+ class Solution {
391
+ fun maximumRemovals (s : String , p : String , removable : IntArray ): Int {
392
+ val strLen = s.length
393
+ val subLen = p.length
394
+
395
+ fun isSub (k : Int ): Boolean {
396
+ val removed = removable.sliceArray(0 .. < k).toHashSet()
397
+
398
+ var subIndex = 0
399
+ for (strIndex in 0 .. < strLen) {
400
+ if (s[strIndex] == p[subIndex] && ! removed.contains(strIndex)) {
401
+ ++ subIndex
402
+ if (subIndex >= subLen) {
403
+ break
404
+ }
405
+ }
406
+ }
407
+
408
+ return subIndex == subLen
409
+ }
410
+
411
+ var left = 0
412
+ var right = removable.size
413
+
414
+ while (left < right) {
415
+ val middle = (left + right) / 2
416
+ if (isSub(middle + 1 )) {
417
+ left = middle + 1
418
+ } else {
419
+ right = middle
420
+ }
421
+ }
422
+ return left
423
+ }
424
+ }
425
+ ```
426
+
340
427
<!-- tabs:end -->
341
428
342
429
<!-- solution:end -->
Original file line number Diff line number Diff line change @@ -282,6 +282,93 @@ impl Solution {
282
282
}
283
283
```
284
284
285
+ #### JavaScript
286
+
287
+ ``` js
288
+ /**
289
+ * @param {string} s
290
+ * @param {string} p
291
+ * @param {number[]} removable
292
+ * @return {number}
293
+ */
294
+ function maximumRemovals (s , p , removable ) {
295
+ const str_len = s .length ;
296
+ const sub_len = p .length ;
297
+
298
+ /**
299
+ * @param {number} k
300
+ * @return {boolean}
301
+ */
302
+ function isSub (k ) {
303
+ const removed = new Set (removable .slice (0 , k));
304
+
305
+ let sub_i = 0 ;
306
+ for (let str_i = 0 ; str_i < str_len; ++ str_i) {
307
+ if (s .charAt (str_i) === p .charAt (sub_i) && ! removed .has (str_i)) {
308
+ ++ sub_i;
309
+ if (sub_i >= sub_len) {
310
+ break ;
311
+ }
312
+ }
313
+ }
314
+ return sub_i === sub_len;
315
+ }
316
+
317
+ let left = 0 ;
318
+ let right = removable .length ;
319
+
320
+ while (left < right) {
321
+ const middle = (left + right) >> 1 ;
322
+ if (isSub (middle + 1 )) {
323
+ left = middle + 1 ;
324
+ } else {
325
+ right = middle;
326
+ }
327
+ }
328
+ return left;
329
+ }
330
+ ```
331
+
332
+ #### Kotlin
333
+
334
+ ``` kotlin
335
+ class Solution {
336
+ fun maximumRemovals (s : String , p : String , removable : IntArray ): Int {
337
+ val strLen = s.length
338
+ val subLen = p.length
339
+
340
+ fun isSub (k : Int ): Boolean {
341
+ val removed = removable.sliceArray(0 .. < k).toHashSet()
342
+
343
+ var subIndex = 0
344
+ for (strIndex in 0 .. < strLen) {
345
+ if (s[strIndex] == p[subIndex] && ! removed.contains(strIndex)) {
346
+ ++ subIndex
347
+ if (subIndex >= subLen) {
348
+ break
349
+ }
350
+ }
351
+ }
352
+
353
+ return subIndex == subLen
354
+ }
355
+
356
+ var left = 0
357
+ var right = removable.size
358
+
359
+ while (left < right) {
360
+ val middle = (left + right) / 2
361
+ if (isSub(middle + 1 )) {
362
+ left = middle + 1
363
+ } else {
364
+ right = middle
365
+ }
366
+ }
367
+ return left
368
+ }
369
+ }
370
+ ```
371
+
285
372
<!-- tabs:end -->
286
373
287
374
<!-- solution:end -->
Original file line number Diff line number Diff line change
1
+ /**
2
+ * @param {string } s
3
+ * @param {string } p
4
+ * @param {number[] } removable
5
+ * @return {number }
6
+ */
7
+ function maximumRemovals ( s , p , removable ) {
8
+ const str_len = s . length ;
9
+ const sub_len = p . length ;
10
+
11
+ /**
12
+ * @param {number } k
13
+ * @return {boolean }
14
+ */
15
+ function isSub ( k ) {
16
+ const removed = new Set ( removable . slice ( 0 , k ) ) ;
17
+
18
+ let sub_i = 0 ;
19
+ for ( let str_i = 0 ; str_i < str_len ; ++ str_i ) {
20
+ if ( s . charAt ( str_i ) === p . charAt ( sub_i ) && ! removed . has ( str_i ) ) {
21
+ ++ sub_i ;
22
+ if ( sub_i >= sub_len ) {
23
+ break ;
24
+ }
25
+ }
26
+ }
27
+ return sub_i === sub_len ;
28
+ }
29
+
30
+ let left = 0 ;
31
+ let right = removable . length ;
32
+
33
+ while ( left < right ) {
34
+ const middle = ( left + right ) >> 1 ;
35
+ if ( isSub ( middle + 1 ) ) {
36
+ left = middle + 1 ;
37
+ } else {
38
+ right = middle ;
39
+ }
40
+ }
41
+ return left ;
42
+ }
Original file line number Diff line number Diff line change
1
+ class Solution {
2
+ fun maximumRemovals (s : String , p : String , removable : IntArray ): Int {
3
+ val strLen = s.length
4
+ val subLen = p.length
5
+
6
+ fun isSub (k : Int ): Boolean {
7
+ val removed = removable.sliceArray(0 .. < k).toHashSet()
8
+
9
+ var subIndex = 0
10
+ for (strIndex in 0 .. < strLen) {
11
+ if (s[strIndex] == p[subIndex] && ! removed.contains(strIndex)) {
12
+ ++ subIndex
13
+ if (subIndex >= subLen) {
14
+ break
15
+ }
16
+ }
17
+ }
18
+
19
+ return subIndex == subLen
20
+ }
21
+
22
+ var left = 0
23
+ var right = removable.size
24
+
25
+ while (left < right) {
26
+ val middle = (left + right) / 2
27
+ if (isSub(middle + 1 )) {
28
+ left = middle + 1
29
+ } else {
30
+ right = middle
31
+ }
32
+ }
33
+ return left
34
+ }
35
+ }
You can’t perform that action at this time.
0 commit comments