kmp算法

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

void prefix_table(char pattern[], int prefix[],int n)
{
    prefix[0] = 0;
    int len = 0;
    int i = 1;

    while (i < n)
    {
        if (pattern[i] == pattern[len])
        {
            len++;
            prefix[i] = len;
            i++;
        }
        else
        {
            if (len > 0)
                len = prefix[len - 1];
            else
            {
                prefix[i] = len;
                i++;
            }

        }
    }
}

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

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

    int i = 0, j = 0, m = strlen(text);

    while (i < m)
    {
        if (j == n - 1 && pattern[j] == text[i])
        {
            printf("Found at %d", i - j);
            j = prefix[j];
        }
        if (text[i] == pattern[j])
        {
            i++;
            j++;
        }
        else
        {
            j = prefix[j];
            if (j == -1)
            {
                i++;
                j++;
            }
        }
    }
}

int main(void)
{
    char pattern[] = "ABABCABAA";
    char text[] = "ABABABCABAABABABABA";

    kmp_search(text, pattern);
    
    /*int prefix[9];
    int n = 9;

    prefix_table(pattern, prefix, 9);
    move_prefix_table(prefix, 9);
    for (int i = 0; i < 9; i++)
    {
        printf("%d ", prefix[i]);
    }*/
    return 0;
}

 

posted @ 2021-01-16 15:08  loliconsk  阅读(140)  评论(0)    收藏  举报