Skip to content

Commit b573d53

Browse files
authored
feat: add Rust solution for lc No.2977 (#4990)
1 parent 7ba06dc commit b573d53

3 files changed

Lines changed: 387 additions & 2 deletions

File tree

solution/2900-2999/2977.Minimum Cost to Convert String II/README.md

Lines changed: 131 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ tags:
5050
- 将子串 source[2..2] 从 "c" 改为 "e" ,成本为 1 。
5151
- 将子串 source[2..2] 从 "e" 改为 "b" ,成本为 2 。
5252
- 将子串 source[3..3] 从 "d" 改为 "e" ,成本为 20 。
53-
产生的总成本是 5 + 1 + 2 + 20 = 28 。
53+
产生的总成本是 5 + 1 + 2 + 20 = 28 。
5454
可以证明这是可能的最小成本。
5555
</pre>
5656

@@ -569,6 +569,136 @@ function minimumCost(
569569
}
570570
```
571571

572+
#### Rust
573+
574+
```rust
575+
use std::cmp::min;
576+
577+
struct Node {
578+
children: [Option<Box<Node>>; 26],
579+
v: i32,
580+
}
581+
582+
impl Node {
583+
fn new() -> Self {
584+
Self {
585+
children: std::array::from_fn(|_| None),
586+
v: -1,
587+
}
588+
}
589+
}
590+
591+
impl Solution {
592+
pub fn minimum_cost(
593+
source: String,
594+
target: String,
595+
original: Vec<String>,
596+
changed: Vec<String>,
597+
cost: Vec<i32>,
598+
) -> i64 {
599+
let inf: i64 = 1 << 60;
600+
let mut root = Box::new(Node::new());
601+
let mut idx: usize = 0;
602+
let m = cost.len();
603+
let n = m << 1;
604+
605+
let mut g = vec![vec![inf; n]; n];
606+
for i in 0..n {
607+
g[i][i] = 0;
608+
}
609+
610+
let mut insert = |w: &str, root: &mut Box<Node>, idx: &mut usize| -> usize {
611+
let mut node: &mut Box<Node> = root;
612+
for c in w.bytes() {
613+
let i = (c - b'a') as usize;
614+
if node.children[i].is_none() {
615+
node.children[i] = Some(Box::new(Node::new()));
616+
}
617+
node = node.children[i].as_mut().unwrap();
618+
}
619+
if node.v < 0 {
620+
node.v = *idx as i32;
621+
*idx += 1;
622+
}
623+
node.v as usize
624+
};
625+
626+
for i in 0..m {
627+
let x = insert(&original[i], &mut root, &mut idx);
628+
let y = insert(&changed[i], &mut root, &mut idx);
629+
g[x][y] = min(g[x][y], cost[i] as i64);
630+
}
631+
632+
for k in 0..idx {
633+
for i in 0..idx {
634+
if g[i][k] >= inf {
635+
continue;
636+
}
637+
for j in 0..idx {
638+
let v = g[i][k] + g[k][j];
639+
if v < g[i][j] {
640+
g[i][j] = v;
641+
}
642+
}
643+
}
644+
}
645+
646+
let s = source.into_bytes();
647+
let t = target.into_bytes();
648+
let len = s.len();
649+
let mut f: Vec<Option<i64>> = vec![None; len];
650+
651+
fn dfs(
652+
i: usize,
653+
s: &[u8],
654+
t: &[u8],
655+
root: &Box<Node>,
656+
g: &Vec<Vec<i64>>,
657+
f: &mut Vec<Option<i64>>,
658+
inf: i64,
659+
) -> i64 {
660+
if i >= s.len() {
661+
return 0;
662+
}
663+
if let Some(v) = f[i] {
664+
return v;
665+
}
666+
let mut res = if s[i] == t[i] {
667+
dfs(i + 1, s, t, root, g, f, inf)
668+
} else {
669+
inf
670+
};
671+
let mut p: Option<&Box<Node>> = Some(root);
672+
let mut q: Option<&Box<Node>> = Some(root);
673+
for j in i..s.len() {
674+
p = p.and_then(|x| x.children[(s[j] - b'a') as usize].as_ref());
675+
q = q.and_then(|x| x.children[(t[j] - b'a') as usize].as_ref());
676+
if p.is_none() || q.is_none() {
677+
break;
678+
}
679+
let pv = p.unwrap().v;
680+
let qv = q.unwrap().v;
681+
if pv < 0 || qv < 0 {
682+
continue;
683+
}
684+
let c = g[pv as usize][qv as usize];
685+
if c < inf {
686+
let v = c + dfs(j + 1, s, t, root, g, f, inf);
687+
if v < res {
688+
res = v;
689+
}
690+
}
691+
}
692+
f[i] = Some(res);
693+
res
694+
}
695+
696+
let ans = dfs(0, &s, &t, &root, &g, &mut f, inf);
697+
if ans >= inf { -1 } else { ans }
698+
}
699+
}
700+
```
701+
572702
<!-- tabs:end -->
573703

574704
<!-- solution:end -->

solution/2900-2999/2977.Minimum Cost to Convert String II/README_EN.md

Lines changed: 131 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ tags:
4747
- Change substring source[2..2] from &quot;c&quot; to &quot;e&quot; at a cost of 1.
4848
- Change substring source[2..2] from &quot;e&quot; to &quot;b&quot; at a cost of 2.
4949
- Change substring source[3..3] from &quot;d&quot; to &quot;e&quot; at a cost of 20.
50-
The total cost incurred is 5 + 1 + 2 + 20 = 28.
50+
The total cost incurred is 5 + 1 + 2 + 20 = 28.
5151
It can be shown that this is the minimum possible cost.
5252
</pre>
5353

@@ -565,6 +565,136 @@ function minimumCost(
565565
}
566566
```
567567

568+
#### Rust
569+
570+
```rust
571+
use std::cmp::min;
572+
573+
struct Node {
574+
children: [Option<Box<Node>>; 26],
575+
v: i32,
576+
}
577+
578+
impl Node {
579+
fn new() -> Self {
580+
Self {
581+
children: std::array::from_fn(|_| None),
582+
v: -1,
583+
}
584+
}
585+
}
586+
587+
impl Solution {
588+
pub fn minimum_cost(
589+
source: String,
590+
target: String,
591+
original: Vec<String>,
592+
changed: Vec<String>,
593+
cost: Vec<i32>,
594+
) -> i64 {
595+
let inf: i64 = 1 << 60;
596+
let mut root = Box::new(Node::new());
597+
let mut idx: usize = 0;
598+
let m = cost.len();
599+
let n = m << 1;
600+
601+
let mut g = vec![vec![inf; n]; n];
602+
for i in 0..n {
603+
g[i][i] = 0;
604+
}
605+
606+
let mut insert = |w: &str, root: &mut Box<Node>, idx: &mut usize| -> usize {
607+
let mut node: &mut Box<Node> = root;
608+
for c in w.bytes() {
609+
let i = (c - b'a') as usize;
610+
if node.children[i].is_none() {
611+
node.children[i] = Some(Box::new(Node::new()));
612+
}
613+
node = node.children[i].as_mut().unwrap();
614+
}
615+
if node.v < 0 {
616+
node.v = *idx as i32;
617+
*idx += 1;
618+
}
619+
node.v as usize
620+
};
621+
622+
for i in 0..m {
623+
let x = insert(&original[i], &mut root, &mut idx);
624+
let y = insert(&changed[i], &mut root, &mut idx);
625+
g[x][y] = min(g[x][y], cost[i] as i64);
626+
}
627+
628+
for k in 0..idx {
629+
for i in 0..idx {
630+
if g[i][k] >= inf {
631+
continue;
632+
}
633+
for j in 0..idx {
634+
let v = g[i][k] + g[k][j];
635+
if v < g[i][j] {
636+
g[i][j] = v;
637+
}
638+
}
639+
}
640+
}
641+
642+
let s = source.into_bytes();
643+
let t = target.into_bytes();
644+
let len = s.len();
645+
let mut f: Vec<Option<i64>> = vec![None; len];
646+
647+
fn dfs(
648+
i: usize,
649+
s: &[u8],
650+
t: &[u8],
651+
root: &Box<Node>,
652+
g: &Vec<Vec<i64>>,
653+
f: &mut Vec<Option<i64>>,
654+
inf: i64,
655+
) -> i64 {
656+
if i >= s.len() {
657+
return 0;
658+
}
659+
if let Some(v) = f[i] {
660+
return v;
661+
}
662+
let mut res = if s[i] == t[i] {
663+
dfs(i + 1, s, t, root, g, f, inf)
664+
} else {
665+
inf
666+
};
667+
let mut p: Option<&Box<Node>> = Some(root);
668+
let mut q: Option<&Box<Node>> = Some(root);
669+
for j in i..s.len() {
670+
p = p.and_then(|x| x.children[(s[j] - b'a') as usize].as_ref());
671+
q = q.and_then(|x| x.children[(t[j] - b'a') as usize].as_ref());
672+
if p.is_none() || q.is_none() {
673+
break;
674+
}
675+
let pv = p.unwrap().v;
676+
let qv = q.unwrap().v;
677+
if pv < 0 || qv < 0 {
678+
continue;
679+
}
680+
let c = g[pv as usize][qv as usize];
681+
if c < inf {
682+
let v = c + dfs(j + 1, s, t, root, g, f, inf);
683+
if v < res {
684+
res = v;
685+
}
686+
}
687+
}
688+
f[i] = Some(res);
689+
res
690+
}
691+
692+
let ans = dfs(0, &s, &t, &root, &g, &mut f, inf);
693+
if ans >= inf { -1 } else { ans }
694+
}
695+
}
696+
```
697+
568698
<!-- tabs:end -->
569699

570700
<!-- solution:end -->

0 commit comments

Comments
 (0)