HJ71. 字符串通配符
描述
问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。
要求:
实现如下2个通配符:
*:匹配0个或以上的字符(注:能被*和?匹配的字符仅由英文字母和数字0到9组成,下同)
?:匹配1个字符
输出:
输入描述
先输入一个带有通配符的字符串,再输入一个需要匹配的字符串
输出描述
返回不区分大小写的匹配结果,匹配成功输出true,匹配失败输出false
示例1
输入:
te?t*.* txt12.xls
输出:
false
示例2
输入:
z zz
输出:
false
示例3
输入:
pq pppq
输出:
false
示例4
输入:
**Z 0QZz
输出:
true
示例5
输入:
?*Bc*? abcd
输出:
true
示例6
输入:
h*?*a h#a
输出:
false
说明:
根据题目描述可知能被*和?匹配的字符仅由英文字母和数字0到9组成,所以?不能匹配#,故输出false示例7
输入:
p*p*qp**pq*p**p***ppq pppppppqppqqppqppppqqqppqppqpqqqppqpqpppqpppqpqqqpqqp
输出:
false
C 解法, 执行用时: 1ms, 内存消耗: 308KB, 提交时间: 2021-08-15
#include<stdio.h> int isCorrect(char ch){ if(isdigit(ch)||isalpha(ch))return 1; else return 0; } int compare(char*tem,char*str) { int i=0,j=0,tempi=0,tempj=0,flag=0; while(j<strlen(str)) { tem[i]=tolower(tem[i]); str[j]=tolower(str[j]); if(tem[i]=='*') { tempi=i; i++; flag=1; tempj=j; } else if(tem[i]==str[j]||(tem[i]=='?'&& isCorrect(str[j]))){ i++; j++; } else if(flag ==1){ j=++tempj; i=tempi; } else return 0; } while(tem[i]=='*'&&tem[i]!='\0') i++; if(tem[i]==0) return 1; return 0; } int main () { char comp[500]={0}; char str[500]={0}; while(scanf("%s%s",&comp,&str)!=EOF) { if(compare(comp,str)) printf("true\n"); else printf("false\n"); } }
C 解法, 执行用时: 2ms, 内存消耗: 280KB, 提交时间: 2021-09-04
#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"); } } }