int Sunday(const char*p1, const char* p2)
{
int len1 = strlen(p1), len2 = strlen(p2);
int i = len2-1, j = len2 - 1;
while (i<len1&&j>=0)
{
if (p1[i] == p2[j])
{
i--;
j--;
}
else
{
i++;
int flag = 0;
for (int k = 0; k < len2; k++)
if (p2[k] == p1[i])
{
j = k;
flag = 1;
break;
}
if (flag == 0)
i += len2;
else
i += len2 - j-1;
j = len2-1;
}
}
if (j < 0)
return ++i;
else
return -1;
}
思路:
将文本串和模式串头部对其,然后从模式串的最后一个字符开始比较,如果两字符相同,则i,j同时减一,若失配,则i++,关注此时文本中匹配的末位字符的后一个字符,如果这个字符在模式串中出现则将模式串中左边第一个出现该字符的位置移动到与文本串中失配字符后一个字符对齐的位置,再将j移动到尾部,同时i也移动与j对齐,向前移动比较,直到j<0,此时i+1即为文本串中第一个出现字串的位置,或者当i>=len1,此时文本串中没有出现模式串,返回-1.