#include<bits/stdc++.h>
#define INF 0x3f3f3f3f3f3f3f3f
#define mod 1000000007
#define IOS ios::sync_with_stdio(false)
#define endl '\n'
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
string ptr, str;
int net[maxn];
void Get_Next() {//求next数组(kmp算法的关键之处)
int i = 0, j = -1;
net[i] = j;
while (i < ptr.size()) {
if (j == -1 || ptr[i] == ptr[j])net[++i] = ++j;
else j = net[j];
}
}
int Kmp_Search1() {//求目标串str中模式串ptr第一次出现的位置
Get_Next();
int i = 0, j = 0;
while (i < str.size() && j < ptr.size()) {
if (j == -1 || ptr[j] == str[i])++i, ++j;
else j = net[j];
}
if (j == ptr.size())return i - j + 1;
return -1;//表示没有找到
}
int Kmp_Search2() {//求目标串str中模式串ptr出现的次数
int i = 0, j = 0;
int ans = 0;
while (i < str.size()) {
if (j == -1 || ptr[j] == str[i])++i, ++j;
else j = net[j];
if (j == ptr.size()) {
++ans;
j = 0;
}
}
return ans;
}
int main() {
cin >> ptr >> str;
cout << Kmp_Search1() << endl;
cout << Kmp_Search2();
}
原文链接: https://www.cnblogs.com/zzqwtc/p/14127385.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/334374
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!