#include <iostream>
using namespace std;
int nextSz[100];
void getNext(const string& s)
{
int i = 1;
int k = 0;
int len = s.size();
while (i < len)
{
while (s[i] != s[k] && k > 0) k = nextSz[k - 1];
if (s[i] == s[k])
{
++k;
}
nextSz[i++] = k;
}
}
//第一次出现的index
int indexOfFirst(string s, string t)
{
for (int i = 0, j = 0; i < s.size(); ++i)
{
while (j > 0 && s[i] != t[j]) j = nextSz[j - 1];
if (s[i] == t[j])
{
++j;
}
if (j == t.size())
{
return i - j + 1;
}
}
return -1;
}
//计算出现多少次
int indexOfCount(string s, string t)
{
int ans = 0;
for (int i = 0, j = 0; i < s.size(); ++i)
{
while (j > 0 && s[i] != t[j]) j = nextSz[j - 1];//若s[i] != t[j] 只移动j不移动i
if (s[i] == t[j])
{
++j;
}
if (j == t.size())
{
++ans;
j = nextSz[j - 1];
}
}
return ans;
}
int main()
{
//在s中找到t
string s, t;
while (cin >> s >> t)
{
memset(nextSz, 0, sizeof nextSz);
getNext(t);
cout << indexOfFirst(s, t) << endl;
cout << indexOfCount(s, t) << endl;
}
}
KMP模板
于 2024-08-23 16:16:31 首次发布