Implement strStr().
Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
实现strStr()函数。
返回needle在haystack中第一次出现的位置,若needle不在其中则返回-1.
方法一:
int ImplementStrStr::strStr1(string haystack, string needle)
{
int m = haystack.size();
int n = needle.size();
if (n == 0) return 0;
for (int i = 0; i < m - n + 1; i++)
{
//逐个匹配,一旦不匹配,跳出循环,从下一个字符开始匹配
int j = 0;
for (; j < n; j++)
{
if (haystack[i + j] != needle[j])
break;
}
if (j == n) return i;
}
return -1;
}
方法二:
KMP算法,具体内容可以从这里了解:
http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
int ImplementStrStr::strStr2(string haystack, string needle)
{
int m = haystack.size();
int n = needle.size();
if (n == 0) return 0;
//kmp部分匹配表
vector<int> lps = kmpProcess(needle);
for (int i = 0, j = 0; i < m;)
{
if (haystack[i] == needle[j])
{
i++;
j++;
}
if (j == n) return i - j;
if (i < m && haystack[i] != needle[j])
{
//这步很关键
if (j > 0) j = lps[j - 1];
else i++;
}
}
return -1;
}
//计算kmp部分匹配表
//这部分用测试代码调试有利于理解
vector<int> ImplementStrStr::kmpProcess(string& needle)
{
int n = needle.size();
vector<int> lps(n, 0);
for (int i = 1, len = 0; i < n;)
{
if (needle[i] == needle[len])
lps[i++] = ++len;
else if (len > 0)
len = lps[len - 1];
else
lps[i++] = 0;
}
return lps;
}