LeetCode(Regular Expression Matching & Wildcard Matching)

文章提供了两种字符串匹配算法,一种处理RegularExpressionMatching,另一种处理WildcardMatching。这两种方法都基于动态规划,通过f(i,j)矩阵来判断子串是否匹配。在处理*字符时,算法有不同的策略。RegularExpressionMatching考虑了*匹配0个或多个字符的情况,而WildcardMatching只考虑*匹配0个或1个字符的情况。
摘要由CSDN通过智能技术生成

Regular Expression Matching

/*
https://leetcode.com/problems/regular-expression-matching/

f(i, j)表示s[0..i - 1]和p[0..j - 1]是否匹配

1、p[j - 1]不为'*':
f(i, j) = f(i - 1, j - 1) && (p[j - 1] == '.' || s[i - 1] == p[j - 1])

2、p[j - 1]为'*':
f(i, j) = f(i, j - 2) ||                                                           // 匹配0个字符
          f(i - 1, j - 2) && (p[j - 2] == '.' || s[i - 1] == p[j - 2]) ||          // 匹配1个字符
          f(i - 2, j - 2) && (p[j - 2] == '.' || s[i - 2..i - 1] == p[j - 2]) ||   // 匹配2个字符
          ...

f(i - 1, j) = f(i - 1, j - 2) ||
              f(i - 2, j - 2) && (p[j - 2] == '.' || s[i - 2] == p[j - 2]) ||
              f(i - 3, j - 2) && (p[j - 2] == '.' || s[i - 3..i - 2] == p[j - 2]) ||
              ...

f(i, j) = f(i, j - 2) || (f(i - 1, j) && (p[j - 2] == '.' || s[i - 1] == p[j - 2]))
*/

bool isMatch(string s, string p)
{
    int i, j, m = s.size(), n = p.size();
    vector<vector<bool>> f(m + 1, vector<bool>(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] = i >= 1 && f[i - 1][j - 1] && (p[j - 1] == '.' || s[i - 1] == p[j - 1]);
            } else {
                f[i][j] = j >= 2 && (f[i][j - 2] || (i >= 1 && f[i - 1][j] && (p[j - 2] == '.' || s[i - 1] == p[j - 2])));
            }
        }
    }
    return f[m][n];
}

Wildcard Matching

/*
https://leetcode.com/problems/wildcard-matching/

f(i, j)表示s[0..i - 1]和p[0..j - 1]是否匹配

1、p[j - 1]不为'*':
f(i, j) = f(i - 1, j - 1) && (p[j - 1] == '?' || s[i - 1] == p[j - 1])

2、p[j - 1]为'*':
f(i, j) = f(i, j - 1) ||       // 匹配0个字符
          f(i - 1, j - 1) ||   // 匹配1个字符
          f(i - 2, j - 1) ||   // 匹配2个字符
          ...

f(i - 1, j) = f(i - 1, j - 1) ||
              f(i - 2, j - 1) ||
              f(i - 3, j - 1) ||
              ...

f(i, j) = f(i, j - 1) || f(i - 1, j)
*/

bool isMatch(string s, string p)
{
    int i, j, m = s.size(), n = p.size();
    vector<vector<bool>> f(m + 1, vector<bool>(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] = i >= 1 && f[i - 1][j - 1] && (p[j - 1] == '?' || s[i - 1] == p[j - 1]);
            } else {
                f[i][j] = f[i][j - 1] || (i >= 1 && f[i - 1][j]);
            }
        }
    }
    return f[m][n];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值