Skip to content

Commit 22cc6fb

Browse files
authored
feat: add rust solution to lc problem: No.0403 (#1525)
1 parent c637967 commit 22cc6fb

File tree

3 files changed

+168
-0
lines changed

3 files changed

+168
-0
lines changed

solution/0400-0499/0403.Frog Jump/README.md

+71
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,77 @@ public:
230230
};
231231
```
232232

233+
### **Rust**
234+
235+
```rust
236+
use std::collections::HashMap;
237+
238+
impl Solution {
239+
#[allow(dead_code)]
240+
pub fn can_cross(stones: Vec<i32>) -> bool {
241+
let n = stones.len();
242+
let mut record = vec![vec![-1; n]; n];
243+
let mut pos = HashMap::new();
244+
for (i, &s) in stones.iter().enumerate() {
245+
pos.insert(s, i);
246+
}
247+
248+
Self::dfs(&mut record, 0, 0, n, &pos, &stones)
249+
}
250+
251+
#[allow(dead_code)]
252+
fn dfs(record: &mut Vec<Vec<i32>>, i: usize, k: usize, n: usize, pos: &HashMap<i32, usize>, stones: &Vec<i32>) -> bool {
253+
if i == n - 1 {
254+
return true;
255+
}
256+
257+
if record[i][k] != -1 {
258+
return record[i][k] == 1;
259+
}
260+
261+
let k = k as i32;
262+
for j in k - 1..=k + 1 {
263+
if j > 0 && pos.contains_key(&(stones[i] + j)) && Self::dfs(record, pos[&(stones[i] + j)], j as usize, n, pos, stones) {
264+
record[i][k as usize] = 1;
265+
return true;
266+
}
267+
}
268+
269+
record[i][k as usize] = 0;
270+
false
271+
}
272+
}
273+
```
274+
275+
```rust
276+
impl Solution {
277+
#[allow(dead_code)]
278+
pub fn can_cross(stones: Vec<i32>) -> bool {
279+
let n = stones.len();
280+
let mut dp = vec![vec![false; n]; n];
281+
282+
// Initialize the dp vector
283+
dp[0][0] = true;
284+
285+
// Begin the actual dp process
286+
for i in 1..n {
287+
for j in (0..=i - 1).rev() {
288+
let k = (stones[i] - stones[j]) as usize;
289+
if k - 1 > j {
290+
break;
291+
}
292+
dp[i][k] = dp[j][k - 1] || dp[j][k] || dp[j][k + 1];
293+
if i == n - 1 && dp[i][k] {
294+
return true;
295+
}
296+
}
297+
}
298+
299+
false
300+
}
301+
}
302+
```
303+
233304
### **Go**
234305

235306
```go

solution/0400-0499/0403.Frog Jump/README_EN.md

+71
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,77 @@ public:
222222
};
223223
```
224224

225+
### **Rust**
226+
227+
```rust
228+
use std::collections::HashMap;
229+
230+
impl Solution {
231+
#[allow(dead_code)]
232+
pub fn can_cross(stones: Vec<i32>) -> bool {
233+
let n = stones.len();
234+
let mut record = vec![vec![-1; n]; n];
235+
let mut pos = HashMap::new();
236+
for (i, &s) in stones.iter().enumerate() {
237+
pos.insert(s, i);
238+
}
239+
240+
Self::dfs(&mut record, 0, 0, n, &pos, &stones)
241+
}
242+
243+
#[allow(dead_code)]
244+
fn dfs(record: &mut Vec<Vec<i32>>, i: usize, k: usize, n: usize, pos: &HashMap<i32, usize>, stones: &Vec<i32>) -> bool {
245+
if i == n - 1 {
246+
return true;
247+
}
248+
249+
if record[i][k] != -1 {
250+
return record[i][k] == 1;
251+
}
252+
253+
let k = k as i32;
254+
for j in k - 1..=k + 1 {
255+
if j > 0 && pos.contains_key(&(stones[i] + j)) && Self::dfs(record, pos[&(stones[i] + j)], j as usize, n, pos, stones) {
256+
record[i][k as usize] = 1;
257+
return true;
258+
}
259+
}
260+
261+
record[i][k as usize] = 0;
262+
false
263+
}
264+
}
265+
```
266+
267+
```rust
268+
impl Solution {
269+
#[allow(dead_code)]
270+
pub fn can_cross(stones: Vec<i32>) -> bool {
271+
let n = stones.len();
272+
let mut dp = vec![vec![false; n]; n];
273+
274+
// Initialize the dp vector
275+
dp[0][0] = true;
276+
277+
// Begin the actual dp process
278+
for i in 1..n {
279+
for j in (0..=i - 1).rev() {
280+
let k = (stones[i] - stones[j]) as usize;
281+
if k - 1 > j {
282+
break;
283+
}
284+
dp[i][k] = dp[j][k - 1] || dp[j][k] || dp[j][k + 1];
285+
if i == n - 1 && dp[i][k] {
286+
return true;
287+
}
288+
}
289+
}
290+
291+
false
292+
}
293+
}
294+
```
295+
225296
### **Go**
226297

227298
```go
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
impl Solution {
2+
#[allow(dead_code)]
3+
pub fn can_cross(stones: Vec<i32>) -> bool {
4+
let n = stones.len();
5+
let mut dp = vec![vec![false; n]; n];
6+
7+
// Initialize the dp vector
8+
dp[0][0] = true;
9+
10+
// Begin the actual dp process
11+
for i in 1..n {
12+
for j in (0..=i - 1).rev() {
13+
let k = (stones[i] - stones[j]) as usize;
14+
if k - 1 > j {
15+
break;
16+
}
17+
dp[i][k] = dp[j][k - 1] || dp[j][k] || dp[j][k + 1];
18+
if i == n - 1 && dp[i][k] {
19+
return true;
20+
}
21+
}
22+
}
23+
24+
false
25+
}
26+
}

0 commit comments

Comments
 (0)