Chinaunix首页 | 论坛 | 博客
  • 博客访问: 354253
  • 博文数量: 87
  • 博客积分: 1322
  • 博客等级: 少尉
  • 技术积分: 915
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-25 18:04
文章分类

全部博文(87)

文章存档

2013年(10)

2012年(9)

2011年(68)

分类:

2011-11-24 10:30:28

原文地址:KMP算法 作者:futurepeter

KMP算法==源代码

#include
using namespace std;

/**
*KMP-Table
*input: pattern
*output : overlap[]
*/
void kmp_table(const char * P, int * overlap)
{
    overlap[0] = -1;
    overlap[1] = 0;
    unsigned int j = 2;
    int cnd = 0;

    while(j < strlen(P))
    {
        if( P[j-1] == P[cnd])
        {
            overlap[j] = cnd + 1;
            ++j;
            ++cnd;
        }
        else if( cnd > 0)
            cnd = overlap[cnd];
        else
        {
            overlap[j] = 0;
            ++j;
        }
    }
}

/**
*KMP_Search
*input: char * Target ;  char * Pattern:
*output ; the position of the Pattern in Traget;
**/
int kmp_search(const char * T, const char * P)
{
    int n = strlen(T);
    int m = strlen(P);
    int * overlap = new int[m];
    int j = 0;

    kmp_table(P,overlap);

    for( int k = 0; k < m; k++)
    {
        cout<    }
    cout<
    for( int i = 0; i < n; i++)
    {
        for(;;)
        {
            if( T[i] == P[j])
            {
                j++;
                if(j == m)
                    return i-m + 1  ;
                break;
            }
            else if(j == 0) break;
            else
            {
                j = overlap[j];
            }
        }
    }
    return -1;
}

int main()
{
    char * S = "acabaabaabcacaabc";
    char * W = "abaabcac";

    int p = kmp_search(S,W);

    cout<<"p = "<< p <}
阅读(606) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~