diff --git a/solution/0000-0099/0010.Regular Expression Matching/README.md b/solution/0000-0099/0010.Regular Expression Matching/README.md index 683a3eb2795f9..e9acc4602cc81 100644 --- a/solution/0000-0099/0010.Regular Expression Matching/README.md +++ b/solution/0000-0099/0010.Regular Expression Matching/README.md @@ -369,6 +369,47 @@ bool isMatch(char* s, char* p) { } ``` +#### PHP + +```php +class Solution { + /** + * @param String $s + * @param String $p + * @return Boolean + */ + function isMatch($s, $p) { + $m = strlen($s); + $n = strlen($p); + $f = array_fill(0, $m + 1, array_fill(0, $n + 1, 0)); + + $dfs = function ($i, $j) use (&$s, &$p, $m, $n, &$f, &$dfs) { + if ($j >= $n) { + return $i == $m; + } + if ($f[$i][$j] != 0) { + return $f[$i][$j] == 1; + } + $res = -1; + if ($j + 1 < $n && $p[$j + 1] == '*') { + if ( + $dfs($i, $j + 2) || + ($i < $m && ($s[$i] == $p[$j] || $p[$j] == '.') && $dfs($i + 1, $j)) + ) { + $res = 1; + } + } elseif ($i < $m && ($s[$i] == $p[$j] || $p[$j] == '.') && $dfs($i + 1, $j + 1)) { + $res = 1; + } + $f[$i][$j] = $res; + return $res == 1; + }; + + return $dfs(0, 0); + } +} +``` + @@ -579,40 +620,31 @@ public class Solution { ```php class Solution { /** - * @param string $s - * @param string $p - * @return boolean + * @param String $s + * @param String $p + * @return Boolean */ - function isMatch($s, $p) { $m = strlen($s); $n = strlen($p); - $dp = array_fill(0, $m + 1, array_fill(0, $n + 1, false)); - $dp[0][0] = true; - - for ($j = 1; $j <= $n; $j++) { - if ($p[$j - 1] == '*') { - $dp[0][$j] = $dp[0][$j - 2]; - } - } + $f = array_fill(0, $m + 1, array_fill(0, $n + 1, false)); + $f[0][0] = true; - for ($i = 1; $i <= $m; $i++) { + for ($i = 0; $i <= $m; $i++) { for ($j = 1; $j <= $n; $j++) { - if ($p[$j - 1] == '.' || $p[$j - 1] == $s[$i - 1]) { - $dp[$i][$j] = $dp[$i - 1][$j - 1]; - } elseif ($p[$j - 1] == '*') { - $dp[$i][$j] = $dp[$i][$j - 2]; - if ($p[$j - 2] == '.' || $p[$j - 2] == $s[$i - 1]) { - $dp[$i][$j] = $dp[$i][$j] || $dp[$i - 1][$j]; + if ($p[$j - 1] == '*') { + $f[$i][$j] = $f[$i][$j - 2]; + if ($i > 0 && ($p[$j - 2] == '.' || $p[$j - 2] == $s[$i - 1])) { + $f[$i][$j] = $f[$i][$j] || $f[$i - 1][$j]; } - } else { - $dp[$i][$j] = false; + } elseif ($i > 0 && ($p[$j - 1] == '.' || $p[$j - 1] == $s[$i - 1])) { + $f[$i][$j] = $f[$i - 1][$j - 1]; } } } - return $dp[$m][$n]; + return $f[$m][$n]; } } ``` diff --git a/solution/0000-0099/0010.Regular Expression Matching/README_EN.md b/solution/0000-0099/0010.Regular Expression Matching/README_EN.md index 5f7d07ae1b9a8..3164f471dd8c2 100644 --- a/solution/0000-0099/0010.Regular Expression Matching/README_EN.md +++ b/solution/0000-0099/0010.Regular Expression Matching/README_EN.md @@ -368,6 +368,47 @@ bool isMatch(char* s, char* p) { } ``` +#### PHP + +```php +class Solution { + /** + * @param String $s + * @param String $p + * @return Boolean + */ + function isMatch($s, $p) { + $m = strlen($s); + $n = strlen($p); + $f = array_fill(0, $m + 1, array_fill(0, $n + 1, 0)); + + $dfs = function ($i, $j) use (&$s, &$p, $m, $n, &$f, &$dfs) { + if ($j >= $n) { + return $i == $m; + } + if ($f[$i][$j] != 0) { + return $f[$i][$j] == 1; + } + $res = -1; + if ($j + 1 < $n && $p[$j + 1] == '*') { + if ( + $dfs($i, $j + 2) || + ($i < $m && ($s[$i] == $p[$j] || $p[$j] == '.') && $dfs($i + 1, $j)) + ) { + $res = 1; + } + } elseif ($i < $m && ($s[$i] == $p[$j] || $p[$j] == '.') && $dfs($i + 1, $j + 1)) { + $res = 1; + } + $f[$i][$j] = $res; + return $res == 1; + }; + + return $dfs(0, 0); + } +} +``` + @@ -578,40 +619,31 @@ public class Solution { ```php class Solution { /** - * @param string $s - * @param string $p - * @return boolean + * @param String $s + * @param String $p + * @return Boolean */ - function isMatch($s, $p) { $m = strlen($s); $n = strlen($p); - $dp = array_fill(0, $m + 1, array_fill(0, $n + 1, false)); - $dp[0][0] = true; - - for ($j = 1; $j <= $n; $j++) { - if ($p[$j - 1] == '*') { - $dp[0][$j] = $dp[0][$j - 2]; - } - } + $f = array_fill(0, $m + 1, array_fill(0, $n + 1, false)); + $f[0][0] = true; - for ($i = 1; $i <= $m; $i++) { + for ($i = 0; $i <= $m; $i++) { for ($j = 1; $j <= $n; $j++) { - if ($p[$j - 1] == '.' || $p[$j - 1] == $s[$i - 1]) { - $dp[$i][$j] = $dp[$i - 1][$j - 1]; - } elseif ($p[$j - 1] == '*') { - $dp[$i][$j] = $dp[$i][$j - 2]; - if ($p[$j - 2] == '.' || $p[$j - 2] == $s[$i - 1]) { - $dp[$i][$j] = $dp[$i][$j] || $dp[$i - 1][$j]; + if ($p[$j - 1] == '*') { + $f[$i][$j] = $f[$i][$j - 2]; + if ($i > 0 && ($p[$j - 2] == '.' || $p[$j - 2] == $s[$i - 1])) { + $f[$i][$j] = $f[$i][$j] || $f[$i - 1][$j]; } - } else { - $dp[$i][$j] = false; + } elseif ($i > 0 && ($p[$j - 1] == '.' || $p[$j - 1] == $s[$i - 1])) { + $f[$i][$j] = $f[$i - 1][$j - 1]; } } } - return $dp[$m][$n]; + return $f[$m][$n]; } } ``` diff --git a/solution/0000-0099/0010.Regular Expression Matching/Solution.php b/solution/0000-0099/0010.Regular Expression Matching/Solution.php index 85a7f34fe75da..fc9aca3447ffe 100644 --- a/solution/0000-0099/0010.Regular Expression Matching/Solution.php +++ b/solution/0000-0099/0010.Regular Expression Matching/Solution.php @@ -1,38 +1,36 @@ class Solution { /** - * @param string $s - * @param string $p - * @return boolean + * @param String $s + * @param String $p + * @return Boolean */ - function isMatch($s, $p) { $m = strlen($s); $n = strlen($p); + $f = array_fill(0, $m + 1, array_fill(0, $n + 1, 0)); - $dp = array_fill(0, $m + 1, array_fill(0, $n + 1, false)); - $dp[0][0] = true; - - for ($j = 1; $j <= $n; $j++) { - if ($p[$j - 1] == '*') { - $dp[0][$j] = $dp[0][$j - 2]; + $dfs = function ($i, $j) use (&$s, &$p, $m, $n, &$f, &$dfs) { + if ($j >= $n) { + return $i == $m; } - } - - for ($i = 1; $i <= $m; $i++) { - for ($j = 1; $j <= $n; $j++) { - if ($p[$j - 1] == '.' || $p[$j - 1] == $s[$i - 1]) { - $dp[$i][$j] = $dp[$i - 1][$j - 1]; - } elseif ($p[$j - 1] == '*') { - $dp[$i][$j] = $dp[$i][$j - 2]; - if ($p[$j - 2] == '.' || $p[$j - 2] == $s[$i - 1]) { - $dp[$i][$j] = $dp[$i][$j] || $dp[$i - 1][$j]; - } - } else { - $dp[$i][$j] = false; + if ($f[$i][$j] != 0) { + return $f[$i][$j] == 1; + } + $res = -1; + if ($j + 1 < $n && $p[$j + 1] == '*') { + if ( + $dfs($i, $j + 2) || + ($i < $m && ($s[$i] == $p[$j] || $p[$j] == '.') && $dfs($i + 1, $j)) + ) { + $res = 1; } + } elseif ($i < $m && ($s[$i] == $p[$j] || $p[$j] == '.') && $dfs($i + 1, $j + 1)) { + $res = 1; } - } + $f[$i][$j] = $res; + return $res == 1; + }; - return $dp[$m][$n]; + return $dfs(0, 0); } -} +} \ No newline at end of file diff --git a/solution/0000-0099/0010.Regular Expression Matching/Solution2.php b/solution/0000-0099/0010.Regular Expression Matching/Solution2.php new file mode 100644 index 0000000000000..6f40295f7f06c --- /dev/null +++ b/solution/0000-0099/0010.Regular Expression Matching/Solution2.php @@ -0,0 +1,29 @@ +class Solution { + /** + * @param String $s + * @param String $p + * @return Boolean + */ + function isMatch($s, $p) { + $m = strlen($s); + $n = strlen($p); + + $f = array_fill(0, $m + 1, array_fill(0, $n + 1, false)); + $f[0][0] = true; + + for ($i = 0; $i <= $m; $i++) { + for ($j = 1; $j <= $n; $j++) { + if ($p[$j - 1] == '*') { + $f[$i][$j] = $f[$i][$j - 2]; + if ($i > 0 && ($p[$j - 2] == '.' || $p[$j - 2] == $s[$i - 1])) { + $f[$i][$j] = $f[$i][$j] || $f[$i - 1][$j]; + } + } elseif ($i > 0 && ($p[$j - 1] == '.' || $p[$j - 1] == $s[$i - 1])) { + $f[$i][$j] = $f[$i - 1][$j - 1]; + } + } + } + + return $f[$m][$n]; + } +} \ No newline at end of file