Skip to content

Commit f52db36

Browse files
committed
feat: add rust solution to lc problem: No.1898
No.1898.Maximum Number of Removable Characters
1 parent fadfb3e commit f52db36

File tree

3 files changed

+127
-0
lines changed

3 files changed

+127
-0
lines changed

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

+44
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,50 @@ func maximumRemovals(s string, p string, removable []int) int {
278278
}
279279
```
280280

281+
### **Rust**
282+
283+
```rust
284+
use std::collections::HashSet;
285+
286+
impl Solution {
287+
pub fn maximum_removals(s: String, p: String, removable: Vec<i32>) -> i32 {
288+
let m = s.len();
289+
let n = p.len();
290+
let s = s.as_bytes();
291+
let p = p.as_bytes();
292+
293+
let check = |k| {
294+
let mut i = 0;
295+
let mut j = 0;
296+
let ids: HashSet<i32> = removable[..k].iter().cloned().collect();
297+
while i < m && j < n {
298+
if !ids.contains(&(i as i32)) && s[i] == p[j] {
299+
j += 1;
300+
}
301+
i += 1;
302+
}
303+
j == n
304+
};
305+
306+
let mut left = 0;
307+
let mut right = removable.len();
308+
while left + 1 < right {
309+
let mid = left + (right - left) / 2;
310+
if check(mid) {
311+
left = mid;
312+
} else {
313+
right = mid;
314+
}
315+
}
316+
317+
if check(right) {
318+
return right as i32;
319+
}
320+
left as i32
321+
}
322+
}
323+
```
324+
281325
### **...**
282326

283327
```

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

+44
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,50 @@ func maximumRemovals(s string, p string, removable []int) int {
253253
}
254254
```
255255

256+
### **Rust**
257+
258+
```rust
259+
use std::collections::HashSet;
260+
261+
impl Solution {
262+
pub fn maximum_removals(s: String, p: String, removable: Vec<i32>) -> i32 {
263+
let m = s.len();
264+
let n = p.len();
265+
let s = s.as_bytes();
266+
let p = p.as_bytes();
267+
268+
let check = |k| {
269+
let mut i = 0;
270+
let mut j = 0;
271+
let ids: HashSet<i32> = removable[..k].iter().cloned().collect();
272+
while i < m && j < n {
273+
if !ids.contains(&(i as i32)) && s[i] == p[j] {
274+
j += 1;
275+
}
276+
i += 1;
277+
}
278+
j == n
279+
};
280+
281+
let mut left = 0;
282+
let mut right = removable.len();
283+
while left + 1 < right {
284+
let mid = left + (right - left) / 2;
285+
if check(mid) {
286+
left = mid;
287+
} else {
288+
right = mid;
289+
}
290+
}
291+
292+
if check(right) {
293+
return right as i32;
294+
}
295+
left as i32
296+
}
297+
}
298+
```
299+
256300
### **...**
257301

258302
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
use std::collections::HashSet;
2+
3+
impl Solution {
4+
pub fn maximum_removals(s: String, p: String, removable: Vec<i32>) -> i32 {
5+
let m = s.len();
6+
let n = p.len();
7+
let s = s.as_bytes();
8+
let p = p.as_bytes();
9+
10+
let check = |k| {
11+
let mut i = 0;
12+
let mut j = 0;
13+
let ids: HashSet<i32> = removable[..k].iter().cloned().collect();
14+
while i < m && j < n {
15+
if !ids.contains(&(i as i32)) && s[i] == p[j] {
16+
j += 1;
17+
}
18+
i += 1;
19+
}
20+
j == n
21+
};
22+
23+
let mut left = 0;
24+
let mut right = removable.len();
25+
while left + 1 < right {
26+
let mid = left + (right - left) / 2;
27+
if check(mid) {
28+
left = mid;
29+
} else {
30+
right = mid;
31+
}
32+
}
33+
34+
if check(right) {
35+
return right as i32;
36+
}
37+
left as i32
38+
}
39+
}

0 commit comments

Comments
 (0)