Implement strStr().
Returns a pointer to the first occurrence of needle in haystack, or null if needle is not part of haystack.
class Solution {
public:
std::vector<int> getNext(char *needle)
{
int nlen = (int) strlen(needle);
std::vector<int> next;
next.resize(nlen);
next[0] = -1;
int i = 0;
int j = -1;
while(i < nlen - 1)
{
if (j == -1 || needle[i] == needle[j])
{
++j;
++i;
if (needle[i] != needle[j])
{
next[i] = j;
}
else
{
next[i] = next[j];
}
}
else
{
j = next[j];
}
}
return next;
}
//KMP
char *strStr(char *haystack, char *needle)
{
int nlen = (int)strlen(needle), hlen = (int)strlen(haystack);
if (nlen > hlen || haystack == NULL || needle == NULL)
{
return NULL;
}
if (nlen == 0)
{
return haystack;
}
std::vector<int> next = getNext(needle);
int i = 0, j = 0;
while(i < hlen && j < nlen)
{
if (j == -1 || haystack[i] == needle[j])
{
++i;
++j;
}
else
{
j = next[j];
}
}
if (j >= nlen)
{
return haystack + i - nlen;
}
else
{
return NULL;
}
}
};