Skip to content

Commit 54778c9

Browse files
authored
feat: add solutions to lc problem: No.1898 (#3794)
No.1898.Maximum Number of Removable Characters
1 parent fc7a458 commit 54778c9

File tree

10 files changed

+539
-543
lines changed

10 files changed

+539
-543
lines changed

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

+181-215
Large diffs are not rendered by default.

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

+185-166
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,32 @@
11
class Solution {
22
public:
33
int maximumRemovals(string s, string p, vector<int>& removable) {
4-
int left = 0, right = removable.size();
5-
while (left < right) {
6-
int mid = left + right + 1 >> 1;
7-
if (check(s, p, removable, mid)) {
8-
left = mid;
9-
} else {
10-
right = mid - 1;
11-
}
12-
}
13-
return left;
14-
}
4+
int m = s.size(), n = p.size();
5+
int l = 0, r = removable.size();
6+
bool rem[m];
157

16-
bool check(string s, string p, vector<int>& removable, int mid) {
17-
int m = s.size(), n = p.size(), i = 0, j = 0;
18-
unordered_set<int> ids;
19-
for (int k = 0; k < mid; ++k) {
20-
ids.insert(removable[k]);
21-
}
22-
while (i < m && j < n) {
23-
if (ids.count(i) == 0 && s[i] == p[j]) {
24-
++j;
8+
auto check = [&](int k) {
9+
memset(rem, false, sizeof(rem));
10+
for (int i = 0; i < k; i++) {
11+
rem[removable[i]] = true;
12+
}
13+
int i = 0, j = 0;
14+
while (i < m && j < n) {
15+
if (!rem[i] && s[i] == p[j]) {
16+
++j;
17+
}
18+
++i;
19+
}
20+
return j == n;
21+
};
22+
while (l < r) {
23+
int mid = (l + r + 1) >> 1;
24+
if (check(mid)) {
25+
l = mid;
26+
} else {
27+
r = mid - 1;
2528
}
26-
++i;
2729
}
28-
return j == n;
30+
return l;
2931
}
30-
};
32+
};
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
11
func maximumRemovals(s string, p string, removable []int) int {
2+
m, n := len(s), len(p)
3+
l, r := 0, len(removable)
24
check := func(k int) bool {
3-
ids := make(map[int]bool)
4-
for _, r := range removable[:k] {
5-
ids[r] = true
5+
rem := make([]bool, m)
6+
for i := 0; i < k; i++ {
7+
rem[removable[i]] = true
68
}
7-
var i, j int
8-
for i < len(s) && j < len(p) {
9-
if !ids[i] && s[i] == p[j] {
9+
i, j := 0, 0
10+
for i < m && j < n {
11+
if !rem[i] && s[i] == p[j] {
1012
j++
1113
}
1214
i++
1315
}
14-
return j == len(p)
16+
return j == n
1517
}
16-
17-
left, right := 0, len(removable)
18-
for left < right {
19-
mid := (left + right + 1) >> 1
18+
for l < r {
19+
mid := (l + r + 1) >> 1
2020
if check(mid) {
21-
left = mid
21+
l = mid
2222
} else {
23-
right = mid - 1
23+
r = mid - 1
2424
}
2525
}
26-
return left
27-
}
26+
return l
27+
}
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,36 @@
11
class Solution {
2+
private char[] s;
3+
private char[] p;
4+
private int[] removable;
5+
26
public int maximumRemovals(String s, String p, int[] removable) {
3-
int left = 0, right = removable.length;
4-
while (left < right) {
5-
int mid = (left + right + 1) >> 1;
6-
if (check(s, p, removable, mid)) {
7-
left = mid;
7+
int l = 0, r = removable.length;
8+
this.s = s.toCharArray();
9+
this.p = p.toCharArray();
10+
this.removable = removable;
11+
while (l < r) {
12+
int mid = (l + r + 1) >> 1;
13+
if (check(mid)) {
14+
l = mid;
815
} else {
9-
right = mid - 1;
16+
r = mid - 1;
1017
}
1118
}
12-
return left;
19+
return l;
1320
}
1421

15-
private boolean check(String s, String p, int[] removable, int mid) {
16-
int m = s.length(), n = p.length(), i = 0, j = 0;
17-
Set<Integer> ids = new HashSet<>();
18-
for (int k = 0; k < mid; ++k) {
19-
ids.add(removable[k]);
22+
private boolean check(int k) {
23+
boolean[] rem = new boolean[s.length];
24+
for (int i = 0; i < k; ++i) {
25+
rem[removable[i]] = true;
2026
}
21-
while (i < m && j < n) {
22-
if (!ids.contains(i) && s.charAt(i) == p.charAt(j)) {
27+
int i = 0, j = 0;
28+
while (i < s.length && j < p.length) {
29+
if (!rem[i] && p[j] == s[i]) {
2330
++j;
2431
}
2532
++i;
2633
}
27-
return j == n;
34+
return j == p.length;
2835
}
29-
}
36+
}

solution/1800-1899/1898.Maximum Number of Removable Characters/Solution.js

+25-28
Original file line numberDiff line numberDiff line change
@@ -4,39 +4,36 @@
44
* @param {number[]} removable
55
* @return {number}
66
*/
7-
function maximumRemovals(s, p, removable) {
8-
const str_len = s.length;
9-
const sub_len = p.length;
7+
var maximumRemovals = function (s, p, removable) {
8+
const [m, n] = [s.length, p.length];
9+
let [l, r] = [0, removable.length];
10+
const rem = Array(m);
1011

11-
/**
12-
* @param {number} k
13-
* @return {boolean}
14-
*/
15-
function isSub(k) {
16-
const removed = new Set(removable.slice(0, k));
12+
const check = k => {
13+
rem.fill(false);
14+
for (let i = 0; i < k; i++) {
15+
rem[removable[i]] = true;
16+
}
1717

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-
}
18+
let i = 0,
19+
j = 0;
20+
while (i < m && j < n) {
21+
if (!rem[i] && s[i] === p[j]) {
22+
j++;
2523
}
24+
i++;
2625
}
27-
return sub_i === sub_len;
28-
}
26+
return j === n;
27+
};
2928

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;
29+
while (l < r) {
30+
const mid = (l + r + 1) >> 1;
31+
if (check(mid)) {
32+
l = mid;
3733
} else {
38-
right = middle;
34+
r = mid - 1;
3935
}
4036
}
41-
return left;
42-
}
37+
38+
return l;
39+
};
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,35 @@
11
class Solution {
2-
fun maximumRemovals(s: String, p: String, removable: IntArray): Int {
3-
val strLen = s.length
4-
val subLen = p.length
2+
fun maximumRemovals(s: String, p: String, removable: IntArray): Int {
3+
val m = s.length
4+
val n = p.length
5+
var l = 0
6+
var r = removable.size
57

6-
fun isSub(k: Int): Boolean {
7-
val removed = removable.sliceArray(0 ..< k).toHashSet()
8+
fun check(k: Int): Boolean {
9+
val rem = BooleanArray(m)
10+
for (i in 0 until k) {
11+
rem[removable[i]] = true
12+
}
13+
var i = 0
14+
var j = 0
15+
while (i < m && j < n) {
16+
if (!rem[i] && s[i] == p[j]) {
17+
j++
18+
}
19+
i++
20+
}
21+
return j == n
22+
}
823

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-
}
24+
while (l < r) {
25+
val mid = (l + r + 1) / 2
26+
if (check(mid)) {
27+
l = mid
28+
} else {
29+
r = mid - 1
30+
}
31+
}
1832

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-
}
33+
return l
34+
}
3535
}
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
class Solution:
22
def maximumRemovals(self, s: str, p: str, removable: List[int]) -> int:
3-
def check(k):
3+
def check(k: int) -> bool:
4+
rem = [False] * len(s)
5+
for i in removable[:k]:
6+
rem[i] = True
47
i = j = 0
5-
ids = set(removable[:k])
6-
while i < m and j < n:
7-
if i not in ids and s[i] == p[j]:
8+
while i < len(s) and j < len(p):
9+
if not rem[i] and p[j] == s[i]:
810
j += 1
911
i += 1
10-
return j == n
12+
return j == len(p)
1113

12-
m, n = len(s), len(p)
13-
left, right = 0, len(removable)
14-
while left < right:
15-
mid = (left + right + 1) >> 1
14+
l, r = 0, len(removable)
15+
while l < r:
16+
mid = (l + r + 1) >> 1
1617
if check(mid):
17-
left = mid
18+
l = mid
1819
else:
19-
right = mid - 1
20-
return left
20+
r = mid - 1
21+
return l
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,37 @@
1-
use std::collections::HashSet;
2-
31
impl Solution {
42
pub fn maximum_removals(s: String, p: String, removable: Vec<i32>) -> i32 {
53
let m = s.len();
64
let n = p.len();
7-
let s = s.as_bytes();
8-
let p = p.as_bytes();
5+
let s: Vec<char> = s.chars().collect();
6+
let p: Vec<char> = p.chars().collect();
7+
let mut l = 0;
8+
let mut r = removable.len();
99

10-
let check = |k| {
10+
let check = |k: usize| -> bool {
11+
let mut rem = vec![false; m];
12+
for i in 0..k {
13+
rem[removable[i] as usize] = true;
14+
}
1115
let mut i = 0;
1216
let mut j = 0;
13-
let ids: HashSet<i32> = removable[..k].iter().cloned().collect();
1417
while i < m && j < n {
15-
if !ids.contains(&(i as i32)) && s[i] == p[j] {
18+
if !rem[i] && s[i] == p[j] {
1619
j += 1;
1720
}
1821
i += 1;
1922
}
2023
j == n
2124
};
2225

23-
let mut left = 0;
24-
let mut right = removable.len();
25-
while left + 1 < right {
26-
let mid = left + (right - left) / 2;
26+
while l < r {
27+
let mid = (l + r + 1) / 2;
2728
if check(mid) {
28-
left = mid;
29+
l = mid;
2930
} else {
30-
right = mid;
31+
r = mid - 1;
3132
}
3233
}
3334

34-
if check(right) {
35-
return right as i32;
36-
}
37-
left as i32
35+
l as i32
3836
}
3937
}

0 commit comments

Comments
 (0)