我是靠谱客的博主 开心糖豆,最近开发中收集的这篇文章主要介绍子串查找(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算法)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部