KMP算法

#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大佬

    KMP算法

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/334374

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午9:38
下一篇 2023年3月1日 下午9:39

相关推荐