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 6d918ed

Browse files
feat: add php solution to lc problem: No.0010 (#4510)
No.0010.Regular Expression Matching
1 parent 9dcd740 commit 6d918ed

File tree

4 files changed

+161
-70
lines changed

4 files changed

+161
-70
lines changed

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

Lines changed: 54 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,47 @@ bool isMatch(char* s, char* p) {
369369
}
370370
```
371371
372+
#### PHP
373+
374+
```php
375+
class Solution {
376+
/**
377+
* @param String $s
378+
* @param String $p
379+
* @return Boolean
380+
*/
381+
function isMatch($s, $p) {
382+
$m = strlen($s);
383+
$n = strlen($p);
384+
$f = array_fill(0, $m + 1, array_fill(0, $n + 1, 0));
385+
386+
$dfs = function ($i, $j) use (&$s, &$p, $m, $n, &$f, &$dfs) {
387+
if ($j >= $n) {
388+
return $i == $m;
389+
}
390+
if ($f[$i][$j] != 0) {
391+
return $f[$i][$j] == 1;
392+
}
393+
$res = -1;
394+
if ($j + 1 < $n && $p[$j + 1] == '*') {
395+
if (
396+
$dfs($i, $j + 2) ||
397+
($i < $m && ($s[$i] == $p[$j] || $p[$j] == '.') && $dfs($i + 1, $j))
398+
) {
399+
$res = 1;
400+
}
401+
} elseif ($i < $m && ($s[$i] == $p[$j] || $p[$j] == '.') && $dfs($i + 1, $j + 1)) {
402+
$res = 1;
403+
}
404+
$f[$i][$j] = $res;
405+
return $res == 1;
406+
};
407+
408+
return $dfs(0, 0);
409+
}
410+
}
411+
```
412+
372413
<!-- tabs:end -->
373414

374415
<!-- solution:end -->
@@ -579,40 +620,31 @@ public class Solution {
579620
```php
580621
class Solution {
581622
/**
582-
* @param string $s
583-
* @param string $p
584-
* @return boolean
623+
* @param String $s
624+
* @param String $p
625+
* @return Boolean
585626
*/
586-
587627
function isMatch($s, $p) {
588628
$m = strlen($s);
589629
$n = strlen($p);
590630

591-
$dp = array_fill(0, $m + 1, array_fill(0, $n + 1, false));
592-
$dp[0][0] = true;
593-
594-
for ($j = 1; $j <= $n; $j++) {
595-
if ($p[$j - 1] == '*') {
596-
$dp[0][$j] = $dp[0][$j - 2];
597-
}
598-
}
631+
$f = array_fill(0, $m + 1, array_fill(0, $n + 1, false));
632+
$f[0][0] = true;
599633

600-
for ($i = 1; $i <= $m; $i++) {
634+
for ($i = 0; $i <= $m; $i++) {
601635
for ($j = 1; $j <= $n; $j++) {
602-
if ($p[$j - 1] == '.' || $p[$j - 1] == $s[$i - 1]) {
603-
$dp[$i][$j] = $dp[$i - 1][$j - 1];
604-
} elseif ($p[$j - 1] == '*') {
605-
$dp[$i][$j] = $dp[$i][$j - 2];
606-
if ($p[$j - 2] == '.' || $p[$j - 2] == $s[$i - 1]) {
607-
$dp[$i][$j] = $dp[$i][$j] || $dp[$i - 1][$j];
636+
if ($p[$j - 1] == '*') {
637+
$f[$i][$j] = $f[$i][$j - 2];
638+
if ($i > 0 && ($p[$j - 2] == '.' || $p[$j - 2] == $s[$i - 1])) {
639+
$f[$i][$j] = $f[$i][$j] || $f[$i - 1][$j];
608640
}
609-
} else {
610-
$dp[$i][$j] = false;
641+
} elseif ($i > 0 && ($p[$j - 1] == '.' || $p[$j - 1] == $s[$i - 1])) {
642+
$f[$i][$j] = $f[$i - 1][$j - 1];
611643
}
612644
}
613645
}
614646

615-
return $dp[$m][$n];
647+
return $f[$m][$n];
616648
}
617649
}
618650
```

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

Lines changed: 54 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,47 @@ bool isMatch(char* s, char* p) {
368368
}
369369
```
370370
371+
#### PHP
372+
373+
```php
374+
class Solution {
375+
/**
376+
* @param String $s
377+
* @param String $p
378+
* @return Boolean
379+
*/
380+
function isMatch($s, $p) {
381+
$m = strlen($s);
382+
$n = strlen($p);
383+
$f = array_fill(0, $m + 1, array_fill(0, $n + 1, 0));
384+
385+
$dfs = function ($i, $j) use (&$s, &$p, $m, $n, &$f, &$dfs) {
386+
if ($j >= $n) {
387+
return $i == $m;
388+
}
389+
if ($f[$i][$j] != 0) {
390+
return $f[$i][$j] == 1;
391+
}
392+
$res = -1;
393+
if ($j + 1 < $n && $p[$j + 1] == '*') {
394+
if (
395+
$dfs($i, $j + 2) ||
396+
($i < $m && ($s[$i] == $p[$j] || $p[$j] == '.') && $dfs($i + 1, $j))
397+
) {
398+
$res = 1;
399+
}
400+
} elseif ($i < $m && ($s[$i] == $p[$j] || $p[$j] == '.') && $dfs($i + 1, $j + 1)) {
401+
$res = 1;
402+
}
403+
$f[$i][$j] = $res;
404+
return $res == 1;
405+
};
406+
407+
return $dfs(0, 0);
408+
}
409+
}
410+
```
411+
371412
<!-- tabs:end -->
372413

373414
<!-- solution:end -->
@@ -578,40 +619,31 @@ public class Solution {
578619
```php
579620
class Solution {
580621
/**
581-
* @param string $s
582-
* @param string $p
583-
* @return boolean
622+
* @param String $s
623+
* @param String $p
624+
* @return Boolean
584625
*/
585-
586626
function isMatch($s, $p) {
587627
$m = strlen($s);
588628
$n = strlen($p);
589629

590-
$dp = array_fill(0, $m + 1, array_fill(0, $n + 1, false));
591-
$dp[0][0] = true;
592-
593-
for ($j = 1; $j <= $n; $j++) {
594-
if ($p[$j - 1] == '*') {
595-
$dp[0][$j] = $dp[0][$j - 2];
596-
}
597-
}
630+
$f = array_fill(0, $m + 1, array_fill(0, $n + 1, false));
631+
$f[0][0] = true;
598632

599-
for ($i = 1; $i <= $m; $i++) {
633+
for ($i = 0; $i <= $m; $i++) {
600634
for ($j = 1; $j <= $n; $j++) {
601-
if ($p[$j - 1] == '.' || $p[$j - 1] == $s[$i - 1]) {
602-
$dp[$i][$j] = $dp[$i - 1][$j - 1];
603-
} elseif ($p[$j - 1] == '*') {
604-
$dp[$i][$j] = $dp[$i][$j - 2];
605-
if ($p[$j - 2] == '.' || $p[$j - 2] == $s[$i - 1]) {
606-
$dp[$i][$j] = $dp[$i][$j] || $dp[$i - 1][$j];
635+
if ($p[$j - 1] == '*') {
636+
$f[$i][$j] = $f[$i][$j - 2];
637+
if ($i > 0 && ($p[$j - 2] == '.' || $p[$j - 2] == $s[$i - 1])) {
638+
$f[$i][$j] = $f[$i][$j] || $f[$i - 1][$j];
607639
}
608-
} else {
609-
$dp[$i][$j] = false;
640+
} elseif ($i > 0 && ($p[$j - 1] == '.' || $p[$j - 1] == $s[$i - 1])) {
641+
$f[$i][$j] = $f[$i - 1][$j - 1];
610642
}
611643
}
612644
}
613645

614-
return $dp[$m][$n];
646+
return $f[$m][$n];
615647
}
616648
}
617649
```
Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,36 @@
11
class Solution {
22
/**
3-
* @param string $s
4-
* @param string $p
5-
* @return boolean
3+
* @param String $s
4+
* @param String $p
5+
* @return Boolean
66
*/
7-
87
function isMatch($s, $p) {
98
$m = strlen($s);
109
$n = strlen($p);
10+
$f = array_fill(0, $m + 1, array_fill(0, $n + 1, 0));
1111

12-
$dp = array_fill(0, $m + 1, array_fill(0, $n + 1, false));
13-
$dp[0][0] = true;
14-
15-
for ($j = 1; $j <= $n; $j++) {
16-
if ($p[$j - 1] == '*') {
17-
$dp[0][$j] = $dp[0][$j - 2];
12+
$dfs = function ($i, $j) use (&$s, &$p, $m, $n, &$f, &$dfs) {
13+
if ($j >= $n) {
14+
return $i == $m;
1815
}
19-
}
20-
21-
for ($i = 1; $i <= $m; $i++) {
22-
for ($j = 1; $j <= $n; $j++) {
23-
if ($p[$j - 1] == '.' || $p[$j - 1] == $s[$i - 1]) {
24-
$dp[$i][$j] = $dp[$i - 1][$j - 1];
25-
} elseif ($p[$j - 1] == '*') {
26-
$dp[$i][$j] = $dp[$i][$j - 2];
27-
if ($p[$j - 2] == '.' || $p[$j - 2] == $s[$i - 1]) {
28-
$dp[$i][$j] = $dp[$i][$j] || $dp[$i - 1][$j];
29-
}
30-
} else {
31-
$dp[$i][$j] = false;
16+
if ($f[$i][$j] != 0) {
17+
return $f[$i][$j] == 1;
18+
}
19+
$res = -1;
20+
if ($j + 1 < $n && $p[$j + 1] == '*') {
21+
if (
22+
$dfs($i, $j + 2) ||
23+
($i < $m && ($s[$i] == $p[$j] || $p[$j] == '.') && $dfs($i + 1, $j))
24+
) {
25+
$res = 1;
3226
}
27+
} elseif ($i < $m && ($s[$i] == $p[$j] || $p[$j] == '.') && $dfs($i + 1, $j + 1)) {
28+
$res = 1;
3329
}
34-
}
30+
$f[$i][$j] = $res;
31+
return $res == 1;
32+
};
3533

36-
return $dp[$m][$n];
34+
return $dfs(0, 0);
3735
}
38-
}
36+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
class Solution {
2+
/**
3+
* @param String $s
4+
* @param String $p
5+
* @return Boolean
6+
*/
7+
function isMatch($s, $p) {
8+
$m = strlen($s);
9+
$n = strlen($p);
10+
11+
$f = array_fill(0, $m + 1, array_fill(0, $n + 1, false));
12+
$f[0][0] = true;
13+
14+
for ($i = 0; $i <= $m; $i++) {
15+
for ($j = 1; $j <= $n; $j++) {
16+
if ($p[$j - 1] == '*') {
17+
$f[$i][$j] = $f[$i][$j - 2];
18+
if ($i > 0 && ($p[$j - 2] == '.' || $p[$j - 2] == $s[$i - 1])) {
19+
$f[$i][$j] = $f[$i][$j] || $f[$i - 1][$j];
20+
}
21+
} elseif ($i > 0 && ($p[$j - 1] == '.' || $p[$j - 1] == $s[$i - 1])) {
22+
$f[$i][$j] = $f[$i - 1][$j - 1];
23+
}
24+
}
25+
}
26+
27+
return $f[$m][$n];
28+
}
29+
}

0 commit comments

Comments
(0)

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