按照对算法的理解,自己敲的kmp,改了半天的Bug
class Solution {
public:
void create_next(const vector<char>& a, vector<int>& next) {
int i = 2;
while (i < a.size())
{
// 目标是next[i],实际上是用a[i-1]去做对比
int max_common_len = next[i - 1];
while (a[i-1] != a[max_common_len])
{
max_common_len = next[max_common_len];
if (max_common_len == 0) break;
}
if (max_common_len == 0)
{
if (a[i-1] == a[0]) next[i] = 1;
}
else
{
next[i] = max_common_len + 1;
}
++i;
}
return;
}
int kmp(const vector<char>& text, const vector<char>& a, const vector<int> next) {
int i = 0;
int j = 0;
while (i < text.size() && j < a.size())
{
if (text[i] == a[j])
{
++i;
++j;
if (j == a.size())
{
cout << "successful!!! "<<i-j;
return i-j;
}
}
else
{
//上一轮刚刚加+1
if (i >= 1 && j >= 1&&text[i - 1] == a[j - 1])
{
j = next[j];
}
else
{
if (j == 0)
{
++i;
}
}
}
}
return -1;
}
int strStr(string haystack, string needle) {
if(needle.empty()){
return 0;
}
//vector<char> a = { 'c','h','i','n','c','h','i','l','l','a' };
//vector<char> a = { 'a','b','a','b','a','b','c','a'};
vector<char> a;
vector<char> text;
for(int i = 0 ;i < haystack.size();++i){
text.push_back(haystack[i]);
}
for(int i = 0 ;i < needle.size();++i){
a.push_back(needle[i]);
}
vector<int> next(a.size(), 0);
create_next(a, next);
for (int i = 0; i < a.size(); ++i)
{
printf("%-6c", a[i]);
}
cout << endl;
for (int i = 0; i < next.size(); ++i)
{
printf("%-6d", next[i]);
}
cout << endl;
//vector<char> text = { 'a','b','a','b','a','b','a','b','c','a' };
int res = kmp(text, a, next);
return res;
}
};