int strStr(char *haystack, char *needle)
{
int i = 0;
int j = 0;
int k = 0;
int hlen = 0;
int nlen = 0;
if (needle == NULL || *needle == 0)
return 0;
if (haystack == NULL || *haystack == 0)
return -1;
hlen = strlen(haystack);
nlen = strlen(needle);
if (hlen < nlen)
return -1;
for (i = 0; i <= hlen - nlen; i++)
{
j = 0;
if (haystack[i] != needle[j++])
continue;
k = i + 1;
for (; j < nlen; j++)
{
if (haystack[k] != needle[j])
{
break;
}
else
k++;
}
if (j == nlen)
return i;
}
return -1;
}
void fill_overlap(char *needle, int len_needle, int *overlap)
{
int len = 0;
int i = 0;
overlap[0] = 0;
for (i = 1; i < len_needle;)
{
if (needle[i] == needle[len])
{
len++;
overlap[i++] = len;
}
else
{
if (len)
len = overlap[len - 1];
else
overlap[i++] = 0;
}
}
}
int strStr(char *haystack, char *needle)
{
int i = 0;
int j = 0;
int len_needle = strlen(needle);
int len_haystack = strlen(haystack);
if (!len_needle)
return 0;
int overlap[len_needle];
fill_overlap(needle, len_needle, overlap);
while (i < len_haystack)
{
if (needle[j] == haystack[i])
{
i++;
j++;
}
if (j == len_needle)
{
return (i - j);
}
else if (i < len_haystack && needle[j] != haystack[i])
{
if (j != 0)
j = overlap[j - 1];
else
i = i + 1;
}
}
return -1;
}