Skip to content

Commit 910a556

Browse files
authoredJun 15, 2024··
feat: update solutions to lc problems: No.9~13 (#3111)
1 parent 7a0455c commit 910a556

File tree

18 files changed

+430
-341
lines changed

18 files changed

+430
-341
lines changed
 

‎solution/0000-0099/0009.Palindrome Number/README.md

-25
Original file line numberDiff line numberDiff line change
@@ -174,31 +174,6 @@ function isPalindrome(x: number): boolean {
174174

175175
#### Rust
176176

177-
```rust
178-
impl Solution {
179-
pub fn is_palindrome(x: i32) -> bool {
180-
if x < 0 {
181-
return false;
182-
}
183-
let s = x.to_string();
184-
let bs = s.as_bytes();
185-
let n = bs.len();
186-
let mut l = 0;
187-
let mut r = n - 1;
188-
while l < r {
189-
if bs[l] != bs[r] {
190-
return false;
191-
}
192-
l += 1;
193-
r -= 1;
194-
}
195-
true
196-
}
197-
}
198-
```
199-
200-
#### Rust
201-
202177
```rust
203178
impl Solution {
204179
pub fn is_palindrome(mut x: i32) -> bool {

‎solution/0000-0099/0009.Palindrome Number/README_EN.md

-25
Original file line numberDiff line numberDiff line change
@@ -166,31 +166,6 @@ function isPalindrome(x: number): boolean {
166166

167167
#### Rust
168168

169-
```rust
170-
impl Solution {
171-
pub fn is_palindrome(x: i32) -> bool {
172-
if x < 0 {
173-
return false;
174-
}
175-
let s = x.to_string();
176-
let bs = s.as_bytes();
177-
let n = bs.len();
178-
let mut l = 0;
179-
let mut r = n - 1;
180-
while l < r {
181-
if bs[l] != bs[r] {
182-
return false;
183-
}
184-
l += 1;
185-
r -= 1;
186-
}
187-
true
188-
}
189-
}
190-
```
191-
192-
#### Rust
193-
194169
```rust
195170
impl Solution {
196171
pub fn is_palindrome(mut x: i32) -> bool {

‎solution/0000-0099/0009.Palindrome Number/Solution2.rs

-14
This file was deleted.

‎solution/0000-0099/0010.Regular Expression Matching/README.md

+61-29
Original file line numberDiff line numberDiff line change
@@ -211,41 +211,41 @@ func isMatch(s string, p string) bool {
211211

212212
```rust
213213
impl Solution {
214-
#[allow(dead_code)]
215214
pub fn is_match(s: String, p: String) -> bool {
216-
let n = s.len();
217-
let m = p.len();
218-
let s = s.chars().collect::<Vec<char>>();
219-
let p = p.chars().collect::<Vec<char>>();
220-
221-
let mut dp = vec![vec![false; m + 1]; n + 1];
222-
223-
// Initialize the dp vector
224-
dp[0][0] = true;
225-
226-
for i in 1..=m {
227-
if p[i - 1] == '*' {
228-
dp[0][i] = dp[0][i - 2];
215+
let (m, n) = (s.len(), p.len());
216+
let mut f = vec![vec![0; n + 1]; m + 1];
217+
218+
fn dfs(
219+
s: &Vec<char>,
220+
p: &Vec<char>,
221+
f: &mut Vec<Vec<i32>>,
222+
i: usize,
223+
j: usize,
224+
m: usize,
225+
n: usize
226+
) -> bool {
227+
if j >= n {
228+
return i == m;
229229
}
230-
}
231-
232-
// Begin the actual dp process
233-
for i in 1..=n {
234-
for j in 1..=m {
235-
if s[i - 1] == p[j - 1] || p[j - 1] == '.' {
236-
dp[i][j] = dp[i - 1][j - 1];
237-
}
238-
if p[j - 1] == '*' {
239-
if j >= 2 && (s[i - 1] == p[j - 2] || p[j - 2] == '.') {
240-
dp[i][j] = dp[i - 1][j] || dp[i][j - 2];
241-
} else if j >= 2 && s[i - 1] != p[j - 2] {
242-
dp[i][j] = dp[i][j - 2];
243-
}
230+
if f[i][j] != 0 {
231+
return f[i][j] == 1;
232+
}
233+
let mut res = -1;
234+
if j + 1 < n && p[j + 1] == '*' {
235+
if
236+
dfs(s, p, f, i, j + 2, m, n) ||
237+
(i < m && (s[i] == p[j] || p[j] == '.') && dfs(s, p, f, i + 1, j, m, n))
238+
{
239+
res = 1;
244240
}
241+
} else if i < m && (s[i] == p[j] || p[j] == '.') && dfs(s, p, f, i + 1, j + 1, m, n) {
242+
res = 1;
245243
}
244+
f[i][j] = res;
245+
res == 1
246246
}
247247

248-
dp[n][m]
248+
dfs(&s.chars().collect(), &p.chars().collect(), &mut f, 0, 0, m, n)
249249
}
250250
}
251251
```
@@ -443,6 +443,38 @@ func isMatch(s string, p string) bool {
443443
}
444444
```
445445

446+
#### Rust
447+
448+
```rust
449+
impl Solution {
450+
pub fn is_match(s: String, p: String) -> bool {
451+
let m = s.len();
452+
let n = p.len();
453+
let mut f = vec![vec![false; n + 1]; m + 1];
454+
455+
f[0][0] = true;
456+
457+
let s: Vec<char> = s.chars().collect();
458+
let p: Vec<char> = p.chars().collect();
459+
460+
for i in 0..=m {
461+
for j in 1..=n {
462+
if p[j - 1] == '*' {
463+
f[i][j] = f[i][j - 2];
464+
if i > 0 && (p[j - 2] == '.' || p[j - 2] == s[i - 1]) {
465+
f[i][j] = f[i][j] || f[i - 1][j];
466+
}
467+
} else if i > 0 && (p[j - 1] == '.' || p[j - 1] == s[i - 1]) {
468+
f[i][j] = f[i - 1][j - 1];
469+
}
470+
}
471+
}
472+
473+
f[m][n]
474+
}
475+
}
476+
```
477+
446478
#### JavaScript
447479

448480
```js

‎solution/0000-0099/0010.Regular Expression Matching/README_EN.md

+61-29
Original file line numberDiff line numberDiff line change
@@ -210,41 +210,41 @@ func isMatch(s string, p string) bool {
210210

211211
```rust
212212
impl Solution {
213-
#[allow(dead_code)]
214213
pub fn is_match(s: String, p: String) -> bool {
215-
let n = s.len();
216-
let m = p.len();
217-
let s = s.chars().collect::<Vec<char>>();
218-
let p = p.chars().collect::<Vec<char>>();
219-
220-
let mut dp = vec![vec![false; m + 1]; n + 1];
221-
222-
// Initialize the dp vector
223-
dp[0][0] = true;
224-
225-
for i in 1..=m {
226-
if p[i - 1] == '*' {
227-
dp[0][i] = dp[0][i - 2];
214+
let (m, n) = (s.len(), p.len());
215+
let mut f = vec![vec![0; n + 1]; m + 1];
216+
217+
fn dfs(
218+
s: &Vec<char>,
219+
p: &Vec<char>,
220+
f: &mut Vec<Vec<i32>>,
221+
i: usize,
222+
j: usize,
223+
m: usize,
224+
n: usize
225+
) -> bool {
226+
if j >= n {
227+
return i == m;
228228
}
229-
}
230-
231-
// Begin the actual dp process
232-
for i in 1..=n {
233-
for j in 1..=m {
234-
if s[i - 1] == p[j - 1] || p[j - 1] == '.' {
235-
dp[i][j] = dp[i - 1][j - 1];
236-
}
237-
if p[j - 1] == '*' {
238-
if j >= 2 && (s[i - 1] == p[j - 2] || p[j - 2] == '.') {
239-
dp[i][j] = dp[i - 1][j] || dp[i][j - 2];
240-
} else if j >= 2 && s[i - 1] != p[j - 2] {
241-
dp[i][j] = dp[i][j - 2];
242-
}
229+
if f[i][j] != 0 {
230+
return f[i][j] == 1;
231+
}
232+
let mut res = -1;
233+
if j + 1 < n && p[j + 1] == '*' {
234+
if
235+
dfs(s, p, f, i, j + 2, m, n) ||
236+
(i < m && (s[i] == p[j] || p[j] == '.') && dfs(s, p, f, i + 1, j, m, n))
237+
{
238+
res = 1;
243239
}
240+
} else if i < m && (s[i] == p[j] || p[j] == '.') && dfs(s, p, f, i + 1, j + 1, m, n) {
241+
res = 1;
244242
}
243+
f[i][j] = res;
244+
res == 1
245245
}
246246

247-
dp[n][m]
247+
dfs(&s.chars().collect(), &p.chars().collect(), &mut f, 0, 0, m, n)
248248
}
249249
}
250250
```
@@ -442,6 +442,38 @@ func isMatch(s string, p string) bool {
442442
}
443443
```
444444

445+
#### Rust
446+
447+
```rust
448+
impl Solution {
449+
pub fn is_match(s: String, p: String) -> bool {
450+
let m = s.len();
451+
let n = p.len();
452+
let mut f = vec![vec![false; n + 1]; m + 1];
453+
454+
f[0][0] = true;
455+
456+
let s: Vec<char> = s.chars().collect();
457+
let p: Vec<char> = p.chars().collect();
458+
459+
for i in 0..=m {
460+
for j in 1..=n {
461+
if p[j - 1] == '*' {
462+
f[i][j] = f[i][j - 2];
463+
if i > 0 && (p[j - 2] == '.' || p[j - 2] == s[i - 1]) {
464+
f[i][j] = f[i][j] || f[i - 1][j];
465+
}
466+
} else if i > 0 && (p[j - 1] == '.' || p[j - 1] == s[i - 1]) {
467+
f[i][j] = f[i - 1][j - 1];
468+
}
469+
}
470+
}
471+
472+
f[m][n]
473+
}
474+
}
475+
```
476+
445477
#### JavaScript
446478

447479
```js
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,38 @@
11
impl Solution {
2-
#[allow(dead_code)]
32
pub fn is_match(s: String, p: String) -> bool {
4-
let n = s.len();
5-
let m = p.len();
6-
let s = s.chars().collect::<Vec<char>>();
7-
let p = p.chars().collect::<Vec<char>>();
3+
let (m, n) = (s.len(), p.len());
4+
let mut f = vec![vec![0; n + 1]; m + 1];
85

9-
let mut dp = vec![vec![false; m + 1]; n + 1];
10-
11-
// Initialize the dp vector
12-
dp[0][0] = true;
13-
14-
for i in 1..=m {
15-
if p[i - 1] == '*' {
16-
dp[0][i] = dp[0][i - 2];
6+
fn dfs(
7+
s: &Vec<char>,
8+
p: &Vec<char>,
9+
f: &mut Vec<Vec<i32>>,
10+
i: usize,
11+
j: usize,
12+
m: usize,
13+
n: usize
14+
) -> bool {
15+
if j >= n {
16+
return i == m;
1717
}
18-
}
19-
20-
// Begin the actual dp process
21-
for i in 1..=n {
22-
for j in 1..=m {
23-
if s[i - 1] == p[j - 1] || p[j - 1] == '.' {
24-
dp[i][j] = dp[i - 1][j - 1];
25-
}
26-
if p[j - 1] == '*' {
27-
if j >= 2 && (s[i - 1] == p[j - 2] || p[j - 2] == '.') {
28-
dp[i][j] = dp[i - 1][j] || dp[i][j - 2];
29-
} else if j >= 2 && s[i - 1] != p[j - 2] {
30-
dp[i][j] = dp[i][j - 2];
31-
}
18+
if f[i][j] != 0 {
19+
return f[i][j] == 1;
20+
}
21+
let mut res = -1;
22+
if j + 1 < n && p[j + 1] == '*' {
23+
if
24+
dfs(s, p, f, i, j + 2, m, n) ||
25+
(i < m && (s[i] == p[j] || p[j] == '.') && dfs(s, p, f, i + 1, j, m, n))
26+
{
27+
res = 1;
3228
}
29+
} else if i < m && (s[i] == p[j] || p[j] == '.') && dfs(s, p, f, i + 1, j + 1, m, n) {
30+
res = 1;
3331
}
32+
f[i][j] = res;
33+
res == 1
3434
}
3535

36-
dp[n][m]
36+
dfs(&s.chars().collect(), &p.chars().collect(), &mut f, 0, 0, m, n)
3737
}
3838
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
impl Solution {
2+
pub fn is_match(s: String, p: String) -> bool {
3+
let m = s.len();
4+
let n = p.len();
5+
let mut f = vec![vec![false; n + 1]; m + 1];
6+
7+
f[0][0] = true;
8+
9+
let s: Vec<char> = s.chars().collect();
10+
let p: Vec<char> = p.chars().collect();
11+
12+
for i in 0..=m {
13+
for j in 1..=n {
14+
if p[j - 1] == '*' {
15+
f[i][j] = f[i][j - 2];
16+
if i > 0 && (p[j - 2] == '.' || p[j - 2] == s[i - 1]) {
17+
f[i][j] = f[i][j] || f[i - 1][j];
18+
}
19+
} else if i > 0 && (p[j - 1] == '.' || p[j - 1] == s[i - 1]) {
20+
f[i][j] = f[i - 1][j - 1];
21+
}
22+
}
23+
}
24+
25+
f[m][n]
26+
}
27+
}

0 commit comments

Comments
 (0)
Please sign in to comment.