题解 | #字符串通配符#
字符串通配符
https://www.nowcoder.com/practice/43072d50a6eb44d2a6c816a283b02036
//本题采用递归思路似乎更加复杂,暴力判断的时间复杂度和递归相差不大,看上去更容易理解
#include <stdio.h>
#include<string.h>
int main()
{
char arr1[100],arr2[100];
gets(arr1);
gets(arr2);
int sz1=strlen(arr1),sz2=strlen(arr2),i=0,j=0,flag=0;
for(i=0;i<sz2;i++)
{
if(!((arr2[i]>='0'&&arr2[i]<='9')||(arr2[i]>='a'&&arr2[i]<='z')||(arr2[i]>='A'&&arr2[i]<='Z')||(arr2[i]=='.')))
{
printf("false\n");
return 0;
}
if(arr2[i]>='A'&&arr2[i]<='Z')
{
arr2[i]+=32;
}
}
for(i=0;i<sz1;i++)
{
if(arr1[i]>='A'&&arr1[i]<='Z')
{
arr1[i]+=32;
}
}
for(i=0;i<sz1;i++)
{
if((arr1[i]>='0'&&arr1[i]<='9')||(arr1[i]>='a'&&arr1[i]<='z')||(arr1[i]>='A'&&arr1[i]<='Z')||(arr1[i]=='.'))
{
if(flag==1)
{
while(arr1[i]!=arr2[j]&&j<sz2)
{
flag=0;
j++;
}
while(arr1[i]==arr2[j]&&j<sz2)
{
flag=0;
j++;
}
if(j==sz2&&arr1[i]!=arr2[sz2-1])
{
printf("false\n");
return 0;
}
else if(j==sz2&&arr1[i]==arr2[sz2-1]&&i!=sz1-1&&arr1[sz1-1]!='*')
{
printf("false\n");
return 0;
}
else if(j==sz2&&i!=sz1-1)
{
if(arr1[i]!='*'&&i<sz1)
{
printf("false\n");
return 0;
}
else
{
i++;
}
}
}
else
{
if(arr1[i]==arr2[j]&&j<sz2)
{
j++;
continue;
}
else
{
printf("false\n");
return 0;
}
}
}
else if(arr1[i]=='?')
{
j++;
continue;
}
else if(arr1[i]=='*')
{
flag=1;
continue;
}
else
{
printf("false\n");
return 0;
}
}
if(arr1[sz1-1]!='*'&&j<sz2)
{
printf("false\n");
return 0;
}
printf("true\n");
return 0;
}
