我是靠谱客的博主 开心糖豆,这篇文章主要介绍子串查找(KMP算法),现在分享给大家,希望可以做个参考。

题目描述

这是一道模板题。

给定一个字符串 A 和一个字符串 B,求 B 在 A 中的出现次数。A 和 B 中的字符均为英语大写字母或小写字母。

A 中不同位置出现的 B 可重叠。

输入格式

输入共两行,分别是字符串 A 和字符串 B。

输出格式

输出一个整数,表示 B 在 A 中的出现次数。

样例

input

output

zyzyzyz

zyz

3

数据范围与提示

1  ≤A,B 的长度 ≤1e6,A、B 仅包含大小写字母。

#include<stdio.h>
#include<string.h>

char a[1000010],b[1000010];
int prefix[1000010];

void get_prefix();
void kmp();

int main()
{
    scanf("%s",a);
    scanf("%s",b);
    kmp();
    return 0;
}

void get_prefix(){
    prefix[0] = -1;
    prefix[1] = 0;
    int i = 1,len = 0,m = strlen(b);
    while(i < m )
    {
        if(b[i] == b[len]){
            len++;
            i++;
            prefix[i] = len;
        }
        else{
            if(len > 0)
            {
                len = prefix[len];
            }
            else{
                prefix[++i] = len;
            }
        }
    }
}

void kmp(){
    get_prefix();
    int n = strlen(a),m = strlen(b);
    int i=0,j=0,sum=0;
    while(i < n)
    {
        if(j == m-1 && a[i] == b[j]){
            sum++;
            j = prefix[j];
        }
        if(a[i] == b[j]){
            i++; j++;
        }
        else{
            j = prefix[j];
            if(j == -1){
                i++; j++;
            }
        }
    }
   printf("%d",sum);
}

思路启发:

KMP字符串匹配算法2_哔哩哔哩_bilibili

KMP算法之求next数组代码讲解_哔哩哔哩_bilibili

最后

以上就是开心糖豆最近收集整理的关于子串查找(KMP算法)的全部内容,更多相关子串查找(KMP算法)内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(138)

评论列表共有 0 条评论

立即
投稿
返回
顶部