百练 6252:带通配符的字符串匹配

来源:互联网 发布:js数组去重方法 编辑:程序博客网 时间:2024/06/03 14:50

题目:

总时间限制: 
1000ms 
内存限制: 
65536kB
描述

通配符是一类键盘字符,当我们不知道真正字符或者不想键入完整名字时,常常使用通配符代替一个或多个真正字符。通配符有问号(?)和星号(*)等,其中,“?”可以代替一个字符,而“*”可以代替零个或多个字符。 

你的任务是,给出一个带有通配符的字符串和一个不带通配符的字符串,判断他们是否能够匹配。 

例如,1?456 可以匹配 12456、13456、1a456,但是却不能够匹配23456、1aa456; 
2*77?8可以匹配 24457798、237708、27798。

输入
输入有两行,每行为一个不超过20个字符的字符串,第一行带通配符,第二行不带通配符
输出
如果两者可以匹配,就输出“matched”,否则输出“not matched”
样例输入
1*456?11111114567
样例输出
matched
    动态规划解法:
    #include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int Tmax=105;char a[Tmax],b[Tmax];int la,lb;bool f[Tmax][Tmax];int main(){    int i,j,k;    scanf("%s",a+1);    scanf("%s",b+1);    la=strlen(a+1);    lb=strlen(b+1);    f[0][0]=1;    for(i=1;i<=la;i++)      for(j=0;j<=lb;j++)      {        if(a[i]==b[j]||a[i]=='?') f[i][j]=f[i-1][j-1];        else if(a[i]=='*')            for(k=j;k>=0;k--)                if(f[i-1][k]==true){                    f[i][j]=true;                    break;                }      }    if(f[la][lb]==true) printf("matched");    else printf("not matched");    return 0;}

    非动态规划解法;
    #include<cstdio>#include<cstring>using namespace std;bool isMatch(const char * s, const char * p){    bool star = false;const char *str,*ptr;for(str = s,ptr=p;*str != '\0'; str++,ptr++){switch(*ptr){case '?': break;case '*': star = true;s = str, p =ptr;while(*p=='*') p++;if(*p == '\0') return true;str = s-1; ptr=p-1;break;default:if(*str != *ptr){if(!star) return false;s++;str = s-1;ptr = p-1;}}}while(*ptr=='*') ptr++;return (*ptr == '\0');}int main(){    char s1[25],s2[25];    scanf("%s%s",s1,s2);    bool ok = isMatch(s2,s1);    if(ok) puts("matched");    else puts("not matched");    return 0;}



原创粉丝点击