数据结构与算法-学习笔记(13)-KMP算法

菜鸟一枚,
刚刚学习数据结构与算法,
为了加深理解,
所以与同学们分享学习过程。

今天学习的是,
KMP算法!!!

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上代码:

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

void prefix_table(char pattern[],int prefix[],int n)
{
    prefix[0] = 0;  //第一个必为0
    int len = 0;  //比较的长度(或者说是位置)最长前后缀的长度
    int i=1;  //检测第i个字母

    while(i<n)
    {
        if(pattern[i] == pattern[len])
        {
            len++;
            prefix[i] = len;  //i处的最长前后缀
            i++;   //进行下一个字母
        }
        else
        {
            if(len>0)
            {
                len = prefix[len-1];
            }
            else
            {
                prefix[i]=len; //len==0
                i++;
            }

        }
    }
}

void move_prefix_table(int prefix[],int n)
{
    int i;
    for(i = n-1;i > 0;i--)
    {
        prefix[i] = prefix[i-1];
    }
    prefix[0] = -1;
}


void kmp_search(char text[],char pattern[])
{
    int n = strlen(pattern);
    int m = strlen(text);
    int* prefix = malloc(sizeof(int) * n);
    prefix_table(pattern,prefix,n);
    move_prefix_table(prefix,n);

    //text[i],len(text) = m
    //pattern[j],len(pattern) = n
    int i = 0;
    int j = 0;
    while(i < m)
    {
        if(j == n-1&&text[i] == pattern[j])//全部匹配上
        {
            printf("Found pattern at %d\n",i-j);
            j = prefix[j];//检查后面还有没有能匹配的
        }
        if(text[i] == pattern[j])
        {
            i++;
            j++;
        }
        else
        {
            j = prefix[j];
        }
        if(j == -1)
        {
            i++;
            j++;
        }
    }
}



int main()
{

    char pattern[] = "ABABCABAA";
    char text[] = "ABABABABCABAAB";
    kmp_search(text,pattern);
//    int prefix[9];
//    int n = 9;
//
//    prefix_table(pattern,prefix,n);
//
//    int i;
//    for(i = 0;i < n;i++)
//    {
//        printf("%d\n",prefix[i]);
//    }

    return 0;
}

谢谢同学们的阅读!!!

发布了28 篇原创文章 · 获赞 15 · 访问量 1051

猜你喜欢

转载自blog.csdn.net/qq_43765237/article/details/105635598
今日推荐