잠토의 잠망경

[알고리즘] KMP 본문

공부/알고리즘

[알고리즘] KMP

잠수함토끼 2018. 9. 15. 08:43

KMP 알고리즘

참고

http://bowbowbow.tistory.com/6

snippet

void getPi(char* Pattern)
{
    int i = 1;
    int j = 0;

    int len = mstrlen(Pattern);

    while (i<len)
    {

        if (Pattern[i] == Pattern[j])
        {
            pi[i] = ++j;
            i++;
        }
        else
        {
            if (j == 0)
            {
                i++;
            }
            else
            {
                j = pi[j - 1];
            }
        }
    }
}

 

 

solution

//http://bowbowbow.tistory.com/6

#include<stdio.h>

#define MAXN (512)

int Border[MAXN];

int pi[MAXN];

inline int mstrlen(char* a)
{
    int i = 0;
    for (; a[i]; i++);
    return i;
}

void getPi(char* Pattern)
{
    int i = 1;
    int j = 0;

    int len = mstrlen(Pattern);

    while (i<len)
    {

        if (Pattern[i] == Pattern[j])
        {
            pi[i] = ++j;
            i++;
        }
        else
        {
            if (j == 0)
            {
                i++;
            }
            else
            {
                j = pi[j - 1];
            }
        }
    }

}

int getPatter(char* Pattern, char* Target)
{
    int i = 0;
    int j = 0;
    int ret = 0;

    int len = mstrlen(Target);

    while (i < len)
    {

        if (Target[i] == Pattern[j])
        {
            if (ret == 0) ret = i;

            i++;
            j++;
        }
        else
        {
            if (j == 0)
            {
                i++;
                ret = 0;
            }
            else
            {
                j = pi[j - 1];
                ret = 0;
            }
        }
    }

    return ret;
}

int main(void)
{
    char Text[] = "ABABABABBABABABABC";
    char Pattern[] = "ABABABABC";

    getPi(Pattern);

    int ret = getPatter(Pattern, Text);

    return 0;
}
Comments