Skip to content

Commit f536b0c

Browse files
committed
feat: add php solution to lc problem: No.0010
No.0010.Regular Expression Matching
1 parent 9dcd740 commit f536b0c

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)