int strStr( const string& haystack, const string& needle) {
vector<int> prefix = get_prefix(needle);
int i = 0, m = haystack.size();
int j = 0, n = needle.size();
while (i < m)
{
if (j == needle.size() - 1 && haystack[i] == needle[j])
{
return i-j;
}
if (haystack[i] == needle[j])
{
i++, j++;
}
else
{
j = prefix[j];
if (j == -1)
{
i++, j++;
}
}
}
return -1;
}
vector<int> get_prefix( const string& pattern)
{
vector<int> prefix(pattern.size(), 0);
prefix[0] = 0;
int len = 0;
int i = 1;
while (i < pattern.size())
{
if (pattern[len] == pattern[i])
{
prefix[i++] = ++len;
}
else
{
if (len > 0)
{
len = prefix[len - 1];
}
else
{
prefix[i++] = len;
}
}
}
vector<int> ret(prefix.size(), 0);
for (size_t i = 1; i < prefix.size(); i++)
{
ret[i] = prefix[i - 1];
}
ret[0] = -1;
return ret;
}