码迷,mamicode.com
首页 > 其他好文 > 详细

44. LeetCode 通配符匹配

时间:2020-07-07 09:18:00      阅读:47      评论:0      收藏:0      [点我收藏+]

标签:表示   字符   成功   描述   https   lan   ret   完全   mat   

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];
}

44. LeetCode 通配符匹配

标签:表示   字符   成功   描述   https   lan   ret   完全   mat   

原文地址:https://www.cnblogs.com/mayabok/p/13258829.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!