LeetCode OJ:Wildcard Matching

Wildcard Matching

 

Implement wildcard pattern matching with support for '?' and '*'.

'?' Matches any single character.
'*' Matches any sequence of characters (including the empty sequence).

The matching should cover the entire input string (not partial).

The function prototype should be:
bool isMatch(const char *s, const char *p)

Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "*") → true
isMatch("aa", "a*") → true
isMatch("ab", "?*") → true
isMatch("aab", "c*a*b") → false
算法思想:动态规划

class Solution {
public:
    bool isMatch(const char *s, const char *p) {
        int m=strlen(p);
        int n=strlen(s);
        
        const char* tmp = p;  
        int cnt = 0;  
        while (*tmp ) if (*(tmp++) != '*') cnt++;  
        if (cnt > n) return false;  
        
        vector<vector<bool>> dp(m+1);
        dp[0].resize(n+1);
        
        dp[0][0]=true;
        for(int i=1; i<=m; i++){
            dp[i].assign(n+1,false);
            if(dp[i-1][0] && p[i-1]=='*') dp[i][0]=true;
            
            for(int j=1; j<=n; j++){
                if (p[i-1] == '*') dp[i][j] = (dp[i][j-1] || dp[i-1][j]);  
                else if (p[i-1] == '?' || p[i-1] == s[j-1]) dp[i][j] = dp[i-1][j-1];  
                else dp[i][j] = false; 
            }
        }
        return dp[m][n];
    }
};

answer2

迭代版

class Solution {
public:
    bool isMatch(const char *s, const char *p) {
        bool star=false;
        const char *str,*ptr;
        for(str=s,ptr=p;*str!='\0';str++,ptr++){
            switch(*ptr){
                case '?':break;
                case '*':
                    star=true;
                    s=str,p=ptr;
                    while(*p=='*')p++;
                    if(*p=='\0')return true;
                    str=s-1;
                    ptr=p-1;
                    break;
                default:
                    if(*str!=*ptr){
                        if(!star)return false;
                        s++;
                        str=s-1;
                        ptr=p-1;
                    }
            }
        }
        while(*ptr =='*')ptr++;
        return (*ptr == '\0');
    }
};



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值