#include <stdio.h>
#include <stdbool.h>
#include <string.h>

// 判断两个字符串是否匹配
bool isMatch(char* str1, char* str2) {
    // 获取两个字符串的长度
    int len1 = strlen(str1);
    int len2 = strlen(str2);
    
    // 创建动态规划表格,用于记录匹配状态
    bool dp[len1+1][len2+1];
    
    // 初始化动态规划表格
    memset(dp, false, sizeof(dp));
    
    // 空字符串与空字符串匹配
    dp[0][0] = true;
    
    // 遍历第一个字符串
    for (int i = 1; i <= len1; i++) {
        // 当第二个字符串为空时,只有第一个字符串全为'*'时才能匹配
        dp[i][0] = (str1[i-1] == '*' && dp[i-1][0]);
    }
    
    // 遍历第二个字符串
    for (int j = 1; j <= len2; j++) {
        // 当第一个字符串为空时,只有第二个字符串全为'*'时才能匹配
        dp[0][j] = (str2[j-1] == '*' && dp[0][j-1]);
    }
    
    // 填充动态规划表格
    for (int i = 1; i <= len1; i++) {
        for (int j = 1; j <= len2; j++) {
            if (str1[i-1] == str2[j-1] || str2[j-1] == '?') {
                // 当前字符匹配,继承前一个状态
                dp[i][j] = dp[i-1][j-1];
            } else if (str2[j-1] == '*') {
                // 遇到通配符'*',可以选择匹配0个字符或多个字符
                dp[i][j] = dp[i-1][j] || dp[i][j-1];
            }
        }
    }
    
    return dp[len1][len2];
}

int main() {
    char str1[100];
    char str2[100];
    
    printf("请输入第一个字符串:");
    fgets(str1, sizeof(str1), stdin);
    
    printf("请输入第二个字符串:");
    fgets(str2, sizeof(str2), stdin);
    
    // 去除字符串中的换行符
    str1[strcspn(str1, "\n")] = '\0';
    str2[strcspn(str2, "\n")] = '\0';
    
    bool match = isMatch(str1, str2);
    
    if (match) {
        printf("yes\n");
    } else {
        printf("no\n");
    }
    
    return 0;
}

该程序使用 C 语言编写的字符串匹配算法,可以处理包含通配符 '' 和 '?' 的字符串。算法使用动态规划的方式,创建一个表格记录匹配状态,并根据字符串中的字符进行状态转移。当遇到通配符 '' 时,可以选择匹配 0 个字符或多个字符。最后,判断动态规划表格的最后一个位置是否为 true,表示两个字符串是否匹配。根据匹配结果输出对应的结果。

C语言实现字符串匹配算法(含通配符 * 和 ?)

原文地址: https://www.cveoy.top/t/topic/bEz7 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录