1. 题目说明

给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。

‘?’ 可以匹配任何单个字符。 ‘*’ 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。

注意:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。

  1. 输入:
  2. s = "adceb"
  3. p = "*a*b"
  4. 输出: true
  5. 输入:
  6. s = "acdcb"
  7. p = "a*c?b"
  8. 输出: false

2. 解题

<?php
class Solution {

    /**
     * @param String $s
     * @param String $p
     * @return Boolean
     */
    public function isMatch($s, $p) {
        $star = -1;
        $i_index = 0;
        $j = $i = 0;
        while($i < strlen($s)) {
            if ($j < strlen($p) && ($s[$i] == $p[$j] || $p[$j] == '?')) {
                $i++;
                $j++;
            } elseif ($j < strlen($p) && $p[$j] == '*') {
                $star = $j;
                $i_index = $i;
                $j++;
            } elseif ($star != -1) {
                $j = $star + 1;
                $i = ++$i_index;
            } else {
                return false;
            }
        }

        do {
            $j++;
        } while ($j < strlen($p) && $p[$j] == '*');

        return $j == strlen($p);
    }
}

$s = "acdcb";
$p = "a*c?b***";
$cls = new Solution();
$r = $cls->isMatch($s, $p);
var_dump($r);