输入包含两行,两个字符串,分别代表str和exp。
如果str是能被exp匹配,请输出“YES”,否则输出“NO”。
abc abc
YES
abcd .*
YES
时间复杂度,额外空间复杂度
,(n为字符串str长度,m为字符串exp长度)
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
// 初始化一个动态大小的矩阵
#define INIT_MATRIX(TYPE, PTR, COL, ROW) \
(PTR) = (TYPE **) malloc(sizeof(TYPE *) * (COL));\
for (int i = 0; i < (COL); i++)\
(PTR)[i] = (TYPE *) calloc((ROW), sizeof(TYPE))
// 释放一个动态大小的矩阵
#define FREE_MATRIX(PTR, COL) \
for (int i = 0; i < (COL); i++) {\
free((PTR)[i]);\
}\
free((PTR))
#define MAXLEN 301
bool is_valid(char *str, char *exp);
bool **get_dp(const char *str, const char *exp, int str_len, int exp_len);
int main(void) {
char str[MAXLEN], exp[MAXLEN];
scanf("%s%s", str, exp);
if (!is_valid(str, exp)) {
printf("NO\n");
return 0;
}
int str_len = (int) strlen(str);
int exp_len = (int) strlen(exp);
bool **dp = get_dp(str, exp, str_len, exp_len);
for (int i = str_len - 1; i >= 0; i--) {
for (int j = exp_len - 2; j >= 0; j--) {
if (exp[j + 1] != '*') {
dp[i][j] = (exp[j] == '.' || str[i] == exp[j])
&& dp[i + 1][j + 1];
} else {
int si = i;
while (si != str_len && (exp[j] == '.' || str[si] == exp[j])) {
if (dp[si][j + 2]) {
dp[i][j] = true;
break;
}
si++;
}
if (!dp[i][j]) {
dp[i][j] = dp[si][j + 2];
}
}
}
}
printf("%s\n", dp[0][0] ? "YES" : "NO");
FREE_MATRIX(dp, strlen(str));
return 0;
}
bool is_valid(char *str, char *exp) {
for (int i = 0; i < strlen(str); i++) {
if (str[i] == '.' || str[i] == '*') {
return false;
}
}
for (int i = 0; i < strlen(exp); i++) {
if (str[i] == '*' && (i == 0 || str[i - 1] == '*')) {
return false;
}
}
return true;
}
bool **get_dp(const char *str, const char *exp, int str_len, int exp_len) {
bool **dp;
INIT_MATRIX(bool, dp, str_len + 1, exp_len + 1);
dp[str_len][exp_len] = true;
for (int j = exp_len - 2; j >= 0; j -= 2) {
dp[str_len][j] = exp[j + 1] == '*';
if (!dp[str_len][j]) {
break;
}
}
dp[str_len - 1][exp_len - 1] = exp[exp_len - 1] == '.' ||
str[str_len - 1] == exp[exp_len - 1];
return dp;
}