C语言实现字符串匹配算法(含通配符 * 和 ?)
#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,表示两个字符串是否匹配。根据匹配结果输出对应的结果。
原文地址: https://www.cveoy.top/t/topic/bEz7 著作权归作者所有。请勿转载和采集!