题目就是输入两个字符串,长度小于20,第一个包含*或者?的通配符,在第二个字符串中找出最早的匹配位置。*可以代替一个或者多个字符,?代替一个字符。
示例:输入:?^_^*和asdfsdf^_^sdfasdf,返回6.
#include <iostream>
#include <string.h>
using namespace std;
int *GetNext(char *str2, int s, char *str1, int &i, int &len)
{
int j=s;
len = 0;
int *index = (int *)malloc(20*sizeof(int));
while(str2[j] != '\0' && str1[i] != '\0')
{
if(str1[i] == '*')
{
i++;
continue;
}
if(str1[i] == '?')
{
i++;
j++;
continue;
}
if(str2[j] == str1[i])
{
index[len++] = j;
}
j++;
}
return index;
}
bool MatchWildCard(char *str1, int s1, char *str2, int s2)
{
if(str1[s1] == '\0')
return true;
if(str1[s1] == '?')
return MatchWildCard(str1, s1+1, str2, s2+1);
if(str1[s1] == '*')
{
if(str1[++s1] == '\0')
return true;
int indexlen = 0;
int *index = GetNext(str2, s2, str1, s1, indexlen);
for(int i=0; i<indexlen; i++)
{
if(MatchWildCard(str1, s1, str2, index[i]))
{
if(indexlen)
free(index);
return true;
}
}
if(indexlen)
free(index);
return false;
}
if(str1[s1] == str2[s2])
return MatchWildCard(str1, ++s1, str2, ++s2);
else
return false;
}
void main()
{
char str1[21], str2[21];
cin >> str1;
cin >> str2;
int len1 = strlen(str1);
int len2 = strlen(str2);
if(len1 > 20 || len2 > 20)
return;
for(int i=0; i<len2; i++)
{
if(MatchWildCard(str1, 0, str2, i))
{
cout << i << endl;
return;
}
}
cout << -1 << endl;
}