44. LeetCode 通配符匹配

44. 通配符匹配

题目链接

题目描述

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

'?' 可以匹配任何单个字符。
'*' 可以匹配任意字符串(包括空字符串)。

两个字符串完全匹配才算匹配成功。

说明:

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

1. 状态转移方程

f[i][j] 表示 s 的前 i 个和 p 的前 j 个 是否可以匹配 。

2. 边界情况

当(i)的值为0,且p的前j个字符均为*时均可匹配,即:

for (int i = 1; i < m; i++) {
    if (p[i] == '*') f[0][i] = true;
    else break;
}

3. 状态转移

  1. 如果 p[j] != '*'p[i][j] = p[i-1][j-1] && (s[i] == p[j] || p[j] == '?')
  2. 如果 p[j] == '*' 则 :
    • p[i][j] = p[i][j-1] 表示第 j 位的 * 匹配的位空字符串
    • p[i][j] = p[i-1][j] 表示第 j 位的 * 匹配的任意字符串

4. 完整代码

bool isMatch(string s, string p) {
    s = " " + s, p = " " + p;
    int n = s.size(), m = p.size();

    vector<vector<bool>> f(n+1, vector<bool> (m+1, false));

    for (int i = 1; i < m; i++) {
        if (p[i] == '*') {
            f[0][i] = true;
        } else {
            break;
        }
    }

    f[0][0] = true;
    for (int i = 1; i < n; i++) {
        for (int j = 1; j < m; j++) {
            if (p[j] != '*') {
                f[i][j] = f[i-1][j-1] && (s[i] == p[j] || p[j] == '?');
            } else {
                f[i][j] = f[i-1][j] || f[i][j-1];
              return f[n-1][m-1];
}
原文地址:https://www.cnblogs.com/mayapony/p/13258829.html