第一行输入一个长度为
、由可见字符构成的通配符字符串
。
第二行输入一个长度为
、由可见字符构成的目标字符串
。
如果可以匹配得到,输出
;否则,输出
。
z zz
false
Z* zz
true
在这个样例中,
匹配
。注意,由于不区分大小写,
可以匹配
。
?* zz
true
在这个样例中,
匹配
、
匹配
。
**Z 0QZz
true
在这个样例中,其中一种匹配方法是:
第一个
匹配
;
第二个
匹配
;
第三个
匹配
。
??** zz
true
可以匹配
个字符。
HH?* HH##1
false
可被
和
匹配的字符不包含
。
#include <ctype.h> #include <stdbool.h> #include <stdio.h> bool isCor(char c) { if (isdigit(c) || islower(c)) { return true; } return false; } bool match(char *s1, char *s2) { int i = 0; int j = 0; int i_pre = 0; int j_pre = 0; int flag = 0; while (s2[j] != '\0') { s1[i] = tolower(s1[i]); s2[j] = tolower(s2[j]); if (s1[i] == '*' && isCor(s2[i])) { i_pre = i; j_pre = j; flag = 1; i++; } else if (s1[i] == '*') { i++; } else if (flag) { i = i_pre; j = j_pre + 1; flag = 0; } else { return false; } } while (s1[i] != '\0') { if (s1[i] != '*') { return false; } i++; } return true; } int main() { char str1[100] = {0}; char str2[100] = {0}; gets(str1); gets(str2); char *ret = match(str1, str2) ? "true" : "false"; printf("%s\n", ret); return 0; }
#include <stdio.h> #include <string.h> #define N 100 int main() { char s[N],p[N]; int dp[N][N]={1},i,lenp,lens,j,k,flag; scanf("%s%s",p,s); lenp=strlen(p); lens=strlen(s); for(i=0;i<lenp;i++) if(p[i]>='A'&&p[i]<='Z') p[i]+='a'-'A'; for(i=0;i<lens;i++) if(s[i]>='A'&&s[i]<='Z') s[i]+='a'-'A'; for(i=0;i<lenp;i++) { for(j=0;j<lens;j++) { if(dp[i][j]) { if(p[i]==s[j]) { dp[i+1][j+1]=1; } else if(p[i]=='*') { dp[i+1][j]=1; k=j; while((s[k]>='0'&&s[k]<='9')||(s[k]>='a'&&s[k]<='z')) { dp[i+1][k+1]=1; k++; } } else if(p[i]=='?'&&((s[j]>='0'&&s[j]<='9')||(s[j]>='a'&&s[j]<='z'))) { dp[i+1][j+1]=1; } } } } if(dp[lenp][lens]) printf("true"); else printf("false"); return 0; }疯狂打补丁。。。
#include<stdio.h> #include<string.h> int max(int a, int b) { return a>b?a:b; } int match(char a[] ,char b[]) { int lena = strlen(a); int lenb = strlen(b); int dp[100][100] = {0}; dp[0][0] = 1; for(int j = 0;j < lenb;j++) { if((b[j] == '.') || ((b[j] >= '0') && (b[j] <= '9')) || ((b[j] >= 'a') && (b[j] <= 'z')) || ((b[j] >= 'A') && (b[j] <= 'Z'))) { continue; } else { return 0; } } for(int i = 1;i <= lena;i++) { if(a[i - 1] == '*') { dp[i][0] = 1; } else { break; } } for(int i = 1;i <= lena;i++) { for(int j = 1;j <= lenb;j++) { if(a[i - 1] == '?') { dp[i][j] = max(dp[i][j] , dp[i-1][j-1]); } if((a[i - 1] == b[j - 1]) || (a[i - 1] == b[j - 1] + 32) || (a[i - 1] == b[j - 1] - 32)) { dp[i][j] = max(dp[i][j] , dp[i-1][j-1]); } if(a[i - 1] == '*') { dp[i][j] = max(dp[i][j] , (dp[i-1][j] || dp[i][j - 1])); } } } return dp[lena][lenb]; } int main() { int m; char a[100],b[100]; while(scanf("%s",&a) != EOF) { scanf("%s",&b) ; m = match(a, b); if(m == 1) { printf("true\n"); } else{ printf("false\n"); } } }
没全对,差一点点
#include<stdio.h> int isChar(char C) { if((C >= 'A' && C <= 'Z') || (C >= '0' && C <= '9') || C == '.') { return 1; } else { return 0; } } char changeUp(char C) { if(C >= 'a' && C <= 'z') { C -= 32; } return C; } int getDP(char a[500], char b[500]) { int m = strlen(a); int n = strlen(b); int dp[500][500] = {0}, maxlen = 0; for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { char p = changeUp(a[i]); char q = changeUp(b[j]); if((p == q) || ((p == '?' || p == '*') && isChar(q) == 1 )) { dp[i][j] = dp[i-1][j-1] + 1; if(dp[i][j] > maxlen) { maxlen = dp[i][j]; // break; // i--; } } } } return maxlen; } int main() { char a[500], b[500]; while(gets(a) && gets(b)) { if(strstr(a, "*") == NULL && strstr(a, "?") == NULL) { if(strlen(a) == strlen(b)) { int result = 1; for(int i = 0; i < strlen(a); i++) { if(a[i] != b[i]){ result = 0;; } } if(result == 1) { printf("true\n"); } else { printf("false\n"); } } else { printf("false\n"); } continue; } char sub[500] = {0}; char *p = &a; char *q = p; while(*p != '\0') { if(*p != '*' && *p != '?') { q = p; break; } p++; } if(*p == '\0') { printf("true\n"); // 通配符字符串只包含*?,直接表示true continue; } int maxlen = 0; maxlen = getDP(a, b); int smallLen = strlen(a) < strlen(b) ? strlen(a): strlen(b); // printf("%d ", maxlen); // printf("%d\n", smallLen); if(maxlen >= smallLen) { printf("true\n"); } else { printf("false\n"); } } }