Skip to content

Commit 9875d40

Browse files
committed
feat: add solutions to lc problem: No.1898
1 parent 7c65397 commit 9875d40

File tree

4 files changed

+251
-0
lines changed

4 files changed

+251
-0
lines changed

solution/1800-1899/1898.Maximum Number of Removable Characters/README.md

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,93 @@ impl Solution {
337337
}
338338
```
339339

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+
340427
<!-- tabs:end -->
341428

342429
<!-- solution:end -->

solution/1800-1899/1898.Maximum Number of Removable Characters/README_EN.md

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,93 @@ impl Solution {
282282
}
283283
```
284284

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+
285372
<!-- tabs:end -->
286373

287374
<!-- solution:end -->
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
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+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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+
}

0 commit comments

Comments
 (0)