[leetcode][C++]44. Wildcard Matching

链接:https://leetcode.com/problems/wildcard-matching/description/

题目说明:外卡匹配,使用动态规划的思路。外卡匹配和正则匹配的最大不同就是外卡匹配中星号可以单独存在。

创建匹配数组(用vector<vector<bool>> match表示),大小分别为s.length()+1和p.length()+1,数组内容match[i][j]表示s中s[i]之前(包含s[i])和p中p[j]之前(包含p[j])是否匹配。

动态规划的初始状态match[0][0]=true;match[i][0]=false;math[0][j]=match[0][j-1] while p[j]='*'

AC代码:

class Solution {
public:
    bool isMatch(string s, string p) {
        int m = s.length();
        int n = p.length();
        
        vector<vector<bool>> match(m+1 ,vector<bool>(n+1, false));
        match[0][0] = true;
        for (int pi = 1; pi <= n; ++pi)
        {
            if (p[pi-1] == '*')
            {
                match[0][pi] = match[0][pi-1];
            }
        }
        
        for (int si = 1; si <= m; ++si)
        {
            for (int pi = 1; pi <= n; ++pi)
            {
                if (s[si-1] == p[pi-1] || p[pi-1] == '?')
                {
                    match[si][pi] = match[si-1][pi-1];
                }
                else if (p[pi-1] == '*')
                {
                    match[si][pi] = match[si-1][pi] || match[si][pi-1];
                }
            }
        }
        return match[m][n];
    }
};

  

转载于:https://www.cnblogs.com/listia/articles/8985097.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值