leetcode-44. 通配符匹配-C语言

本文介绍了一种使用动态规划算法解决正则表达式匹配问题的方法。通过构建二维DP数组,详细解释了如何判断字符串s与正则表达式p的匹配结果,包括特殊情况的处理,如'*'字符的匹配逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


/*
 * 算法思想:
 * 动态规划,dp[i][j]表示s字符串到i时,p字符串到j时,是否能匹配成功;
 * 例如:
 * 字符串s为"abcdeft",p为"a*cd?f*t"
 * 则生成的dp数组为:
       1,       0,       0,       0,       0,       0,       0,       0,       0,
       0,       1,       1,       0,       0,       0,       0,       0,       0,
       0,       0,       1,       0,       0,       0,       0,       0,       0,
       0,       0,       1,       1,       0,       0,       0,       0,       0,
       0,       0,       1,       0,       1,       0,       0,       0,       0,
       0,       0,       1,       0,       0,       1,       0,       0,       0,
       0,       0,       1,       0,       0,       0,       1,       1,       0,
       0,       0,       1,       0,       0,       0,       0,       1,       1, 
 * 其中第0行表示当s为NULL时,与p的匹配结果;第0列表示当p为NULL时,与s的匹配结果。均为NULL时,dp[0][0] = 1;
 * 详见代码注释。
 *
 */

void print(int m, int n, bool dp[m+1][n+1]) {
    int i, j;
    for(i=0; i<=m; i++){
        for(j=0; j<=n; j++){
            printf("%8d,", dp[i][j]);        
        }
        printf("\n");
    }    
    printf("--------\n");
}


bool isMatch(char * s, char * p){
    int m = strlen(s), n = strlen(p), i, j, k;
    
    bool dp[m+1][n+1];
    
    dp[0][0] = 1;
    
    for(i=1; i<=m; i++){
        dp[i][0] = 0;
    }
    for(i=1; i<=n; i++){
        if(p[i-1] != '*'){
            dp[0][i] = 0;    
        }else{
            dp[0][i] = dp[0][i-1];
        }
    }
    
    for(i=0; i<m; i++){
        for(j=0; j<n; j++){   
            if(s[i] == p[j] || p[j] == '?') {
                /* 当当前位置两字符相等或者p[j]=='?'时,只能看两串的前一个位置是否匹配 */
                dp[i+1][j+1] = dp[i][j];
            }else if(p[j] == '*') {
                /* 当当前位置p[j] == '*'时,情况比较多:
                * 1. 如果i-1和j-1位置匹配则,当前i,j匹配成功;
                * 2. 如果i,j-1,匹配成功,则当前i,j匹配成功;
                * 3. 如果i-1,j匹配成功,则当前i,j匹配成功;
                * 4. 上述三种情况任一为1,则当前dp[i][j] = 1;
                * 5. 
                */
                dp[i+1][j+1] = dp[i][j] || dp[i+1][j] || dp[i][j+1];
            }else {
                /* 其他情况无法进行匹配 */
                dp[i+1][j+1] = 0;
            }
        }
    }
    
    //print(m, n, dp);
    
    return dp[m][n];
    
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值