OpenJudge 帶萬用字元的字串匹配

Just Go For It Now發表於2018-09-10

 6252:帶萬用字元的字串匹配

描述

萬用字元是一類鍵盤字元,當我們不知道真正字元或者不想鍵入完整名字時,常常使用萬用字元代替一個或多個真正字元。萬用字元有問號(?)和星號(*)等,其中,“?”可以代替一個字元,而“*”可以代替零個或多個字元。 

你的任務是,給出一個帶有萬用字元的字串和一個不帶萬用字元的字串,判斷他們是否能夠匹配。 

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

輸入

輸入有兩行,每行為一個不超過20個字元的字串,第一行帶萬用字元,第二行不帶萬用字元

輸出

如果兩者可以匹配,就輸出“matched”,否則輸出“not matched”

樣例輸入

1*456?
11111114567

樣例輸出

matched

 模擬字串匹配的過程,注意下面幾個測試樣例

123*45*6
1237894523454336
*?
123456
2*77?8
24457798

以下就是滿分的AC程式碼: 

#include <stdio.h>
#include <string.h>
char str1[21];
char str2[21];
char temp[21];

char* mystrstr(char* s1,char* s2)
{
    int i,j;
    int len1=strlen(s1);
    int len2=strlen(s2);
    for(i=0;i<len1;i++)
    {
        for(j=0;j<len2&&i<len1;)
        {
            if(s1[i]==s2[j])
            {
                i++;
                j++;
            }
            else if(s2[j]=='?')
            {
                i++;
                j++;
            }
            else break;
        }
        if(j==len2)
        {
            return (s1+i-len2);
        }
    }
    return NULL;
}

int main()
{
    scanf("%s %s",str1,str2);
    int len1=strlen(str1);
    int len2=strlen(str2);
    int i=0;
    int j=0;
    int flag=1;
    while(i<len1&&j<len2)
    {
        if(str1[i]=='*')
        {
            int cnt=0;
            int p1=(++i);
            if(i==len1)
            {
                j=len2;
            }
            else
            {
                int p2=0;
                while(str1[p1]!='*'&&str1[p1]!='\0')
                {
                    temp[p2++]=str1[p1++];
                }
                temp[p2]='\0';
                char* p3=str2+j;
                while(mystrstr(p3,temp))
                {
                    p3=mystrstr(p3,temp);
                    p3+=strlen(temp);
                }
                j=(p3-str2);
                i+=strlen(temp);
            }
        }
        else if(str1[i]=='?')
        {
            i++;
            j++;
        }
        else{
            if(str1[i]==str2[j])
            {
                i++;
                j++;
            }
            else
            {
                flag=0;
                break;
            }
        }
    }
    while(i<len1)
    {
        if(str1[i]=='*') i++;
        else
        {
            flag=0;
            break;
        }
    }
    if(i==len1&&j==len2&&flag) printf("matched\n");
    else printf("not matched\n");
    return 0;
}

 

 

相關文章