0
点赞
收藏
分享

微信扫一扫

子串查找(KMP算法)

幸福的无所谓 2022-01-31 阅读 62
算法

题目描述

这是一道模板题。

给定一个字符串 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

举报

相关推荐

0 条评论