第一行输入一个长度为
、由可见字符构成的通配符字符串
。
第二行输入一个长度为
、由可见字符构成的目标字符串
。
如果可以匹配得到,输出
;否则,输出
。
z zz
false
Z* zz
true
在这个样例中,
匹配
。注意,由于不区分大小写,
可以匹配
。
?* zz
true
在这个样例中,
匹配
、
匹配
。
**Z 0QZz
true
在这个样例中,其中一种匹配方法是:
第一个
匹配
;
第二个
匹配
;
第三个
匹配
。
??** zz
true
可以匹配
个字符。
HH?* HH##1
false
可被
和
匹配的字符不包含
。
#include <stdio.h>
#include <string.h>
char s[101] = {0};
char p[101] = {0};
int result;
int cnt;
int max;
void dfs(int sp, int pp) {
if (cnt > max) return;
if (sp == strlen(s)&&pp==strlen(p)) {
result = 1;
return;
}
int i = sp, j = pp;
for (; i < strlen(s); i++, j++) {
if (s[i] != p[j]) {
if (s[i] =='?') {//拿S去对比p,遇到?看对面是不是?、数字、字母
if (p[j] == '?' || (p[j] >= 0 && p[j] <= 9) || (p[j] >= 'a' && p[j] <= 'z'))
continue;
} else if (s[i] == '*') { //遇到*,找到p中与s[i]=*后面第一个字符匹配的所有位置,对每个匹配位置的情况分析
while (s[i] == '*') i++;
if(i>=strlen(s)){
result = 1;
return;
}
if(s[i]!='?'){
int nj = j;
for (; nj < strlen(p); nj++) { //发现需要递归回溯
if (p[nj] == s[i]) {
cnt += nj - j;
dfs(i, nj);
cnt -= nj - j;
}
}
}else if(s[i]=='?'){
int nj = j;
for (; nj < strlen(p); nj++) { //发现需要递归回溯
if (p[j] == '?' || (p[j] >= 0 && p[j] <= 9) || (p[j] >= 'a' && p[j] <= 'z')) {
cnt += nj - j;
dfs(i, nj);
cnt -= nj - j;
}
}
}
continue;
}
break;
}
}
if (i == strlen(s)&&j==strlen(p)) result = 1;
}
int main() {
scanf("%s%s", s, p);
for (int i = 0; i < strlen(s); i++) {
if (s[i] >= 'A' && s[i] <= 'Z')
s[i] = 'a' + s[i] - 'A';
}
for (int i = 0; i < strlen(p); i++) {
if (p[i] >= 'A' && p[i] <= 'Z')
p[i] = 'a' + s[i] - 'A';
}
int lens = 0; //s中非*字符个数
int Fstar = 0;
for (int i = 0; i < strlen(s); i++) {
if (s[i] != '*') lens++;
if (s[i] == '*') Fstar = 1;
}
if (lens == strlen(p)) {
int ii = 0, jj = 0;
for (; ii < strlen(s); ii++, jj++) {
while (s[ii] == '*') ii++;
if (s[ii] != p[jj]) {
if (s[ii] == '?') {
if (p[jj] == '?' || (p[jj] >= 0 && p[jj] <= 9) || (p[jj] >= 'a' && p[jj] <= 'z'))
continue;
}
break;
}
}
if (ii == strlen(s)) result = 1;
} else if (lens < strlen(p)) {//2.一个有,一个没有 lens<lenp有*匹配
if (Fstar) {
max = strlen(p) - lens; //最大可匹配字数
dfs(0, 0);
}
}
if (!result) {
printf("false");
} else {
printf("true");
}
return 0;
}
#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");
}
}
}