Chinaunix首页 | 论坛 | 博客
  • 博客访问: 233440
  • 博文数量: 50
  • 博客积分: 1793
  • 博客等级: 上尉
  • 技术积分: 393
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-22 23:28
文章分类
文章存档

2012年(7)

2011年(17)

2010年(26)

我的朋友

分类:

2011-05-30 15:10:32

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 <}
阅读(999) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~