一级标题 KMP算法 数据结构c++
前缀表(不减一)代码实现
#include<iostream>
#include <vector>
using namespace std;
void getNext(vector<int>next, const string& s) // 求next数组
{
int j = 0;
next.push_back(0);
for (int i = 1; i < s.size(); i++)
{
while (j > 0 && s[i] != s[j])
{
j = next[j - 1];
}
if (s[i] == s[j])
{
j++;
}
next[i] = j;
}
}
int strStr(string haystack, const string& needle)
{
if (needle.size() == 0)
{
return 0;
}
vector<int>next;
next.resize(needle.size());
getNext(next, needle);
int j = 0;
for (int i = 0; i < haystack.size(); i++)
{
while (j > 0 && haystack[i] != needle[j]) {
j = next[j - 1];
}
if (haystack[i] == needle[j]) {
j++;
}
if (j == needle.size()) {
return (i - needle.size() + 1);
}
}
return -1;
}
int main()
{
string str1, str2;
cin >> str1 >> str2;
int pos = strStr(str1, str2);
cout << pos;
return 0;
}
下面这个代码在dev c++上可以 在vs上不可以运行
#include<iostream>
using namespace std;
void getNext(int* next, const string& s)
{
int j = 0;
next[0] = 0;
for (int i = 1; i < s.size(); i++)
{
while (j > 0 && s[i] != s[j])
{
j = next[j - 1];
}
if (s[i] == s[j])
{
j++;
}
next[i] = j;
}
}int strStr(string haystack, const string& needle)
{
if (needle.size() == 0)
{
return 0;
}
int next[needle.size()];
getNext(next, needle);
int j = 0;
for (int i = 0; i < haystack.size(); i++)
{
while (j > 0 && haystack[i] != needle[j]) {
j = next[j - 1];
}
if (haystack[i] == needle[j]) {
j++;
}
if (j == needle.size()) {
return (i - needle.size() + 1);
}
}
return -1;
}
int main()
{
string str1, str2;
cin >> str1 >> str2;
int pos = strStr(str1, str2);
cout << pos;
return 0;
}