Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 54778c9

Browse files
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‎

Lines changed: 181 additions & 215 deletions
Large diffs are not rendered by default.

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

Lines changed: 185 additions & 166 deletions
Large diffs are not rendered by default.
Lines changed: 25 additions & 23 deletions
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+
};
Lines changed: 15 additions & 15 deletions
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:= rangeremovable[:k] {
5-
ids[r] = true
5+
rem := make([]bool, m)
6+
for i:= 0; i<k; i++ {
7+
rem[removable[i]] = true
68
}
7-
vari, 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+
}
Lines changed: 23 additions & 16 deletions
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‎

Lines changed: 25 additions & 28 deletions
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+
};
Lines changed: 30 additions & 30 deletions
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
}
Lines changed: 13 additions & 12 deletions
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
Lines changed: 15 additions & 17 deletions
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 asi32)) && 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)

AltStyle によって変換されたページ (->オリジナル) /