KMP算法代码

#include<stdio.h>
#include<string.h>
class KMP
{
public:
    KMP(const char *P,const char *Q);
    void Deal();
private:
    void GenPi();
    void Search();
    char q[1024];
    char p[1024];
    int pi[1024];
    int Result[1024];
};

KMP::KMP(const char *P,const char *Q)
{
    strcpy(p,P);
    strcpy(q,Q);
}

void KMP::GenPi()
{
    int i,len,k;
    k=0;
    len = strlen(q);
    pi[0]=0;
    for(int i=1;i<len;i++)
    {
        while(k>0 && q[k]!=q[i]) //k代表的是前面匹配上的个数,由于数组从0开始,因此k用在[]中时,需要减1
        {
            k = pi[k-1];
        }
        if(q[k]==q[i])
        {
            k++;
        }
        pi[i]=k;
    }
}

void KMP::Search()
{
    int i,j,len,k,m;
    m = strlen(q);
    k=0;
    j=0;
    len = strlen(p);
    for(int i=0;i<len;i++)
    {
        while(k>0 && q[k]!=p[i])
        {
            k=pi[k-1];
        }
        if(q[k] == p[i])
        {
            k++;
        }
        if(k == m)
        {
            printf("%d\n",i);
            k = pi[k-1];
        }
    }
}

void KMP::Deal()
{
    GenPi();
    Search();
}

int main()
{
    char *P="fffff";
    char *Q="fff";
    KMP oKMP(P,Q);
    oKMP.Deal();
    return 0;
}

KMP算法代码

时间: 2024-12-29 23:10:58

KMP算法代码的相关文章

KMP算法代码实现

//普通的暴力求解法 int ViolentMatch(char* s, char* p)   {       int sLen = strlen(s);       int pLen = strlen(p);          int i = 0;       int j = 0;       while (i < sLen && j < pLen)       {           if (s[i] == p[j])           {               /

kmp算法模板及理解

kmp算法是复杂度为O(n+m)的字符串匹配算法; 首先kmp算法的核心是在模式串中获得next数组,这个数组表示模式串的子串的前缀和后缀相同的最长长度; 这样在匹配的过程中如果指到不匹配的位置,模式串用next数组进行跳转到符合的位置,而目标串不需要再往回匹配,为什么是最长的相同的前缀后后缀呢? 因为只有这样才能一边避免可能漏掉的位置,一边尽量不重复已经匹配的位置; getNext的函数: void getNext() { int k = -1,j = 0,len = strlen(str);

Kmp算法笔记

Kmp算法我是看July博客学习,这里只是做个笔记,详细内容见July的blog: http://blog.csdn.net/v_july_v/article/details/7041827 Kmp算法的用途:有一个文本串S和一个模式串P,现在要查找P在S中的位置.暴力匹配算法需要对文本串S进行回溯,kmp算法就是让文本串不回退,只需要移动模式串j即可. Kmp算法大体思想:就是当s[i]==p[j]时,我们对i++,j++:如果不相等则令j=next[j].这里next[j]为j字符之前的字符

字符串匹配(BF,BM,Sunday,KMP算法解析)

字符串匹配一直是计算机领域热门的研究问题之一,多种算法层出不穷.字符串匹配算法有着很强的实用价值,应用于信息搜索,拼写检查,生物信息学等多个领域. 今天介绍几种比较有名的算法: 1. BF 2. BM 3. Sunday 4. KMP -,BF算法 BF(Brute Force)算法又称为暴力匹配算法,是普通模式匹配算法. 其算法思想很简单,从主串S的第pos个字符开始,和模式串T的第一个字符进行比较,若相等,则主串和模式串都后移一个字符继续比较:若不相同,则回溯到主串S的第pos+1个字符重新

字符串匹配:BF、KMP算法

字符串匹配算法:BF.KMP算法代码. /***************************************** Copyright (c) 2015 Jingshuang Hu @filename:demo.c @datetime:2015.10.11 @author:HJS @e-mail:[email protected] @blog:http://blog.csdn.net/hujingshuang **************************************

kmp算法简明教程

在字符串s中寻找模式串p的位置,这是一个字符串匹配问题. 举例说明: i = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 s = a b a a c a b a a a b a a b p = a b a a b j = 0 1 2 3 4 在kmp算法发明之前.人们使用这种算法: ''' 原始的求子串位置算法,O( m * n ) ''' def string_index_of( pstr, pattern, pos = 0 ): str_index = pos patte

Kmp算法浅谈

Kmp算法浅谈 一.Kmp算法思想 在主串和模式串进行匹配时,利用next数组不改变主串的匹配指针而是改变模式串的匹配指针,减少大量的重复匹配时间.在Kmp算法中,next数组的构建是整个Kmp算法的核心所在. 二.Kmp核心之next数组的构建 (1)前缀,后缀的定义 (2)最长公共前后缀定义 (3)next数组的含义 next数组代表各个长度子串(这些字串的起始位置都为0)的最长公共前后缀长度,为了方便代码的编写next[0]定为-1,表示前0个字符根本不存在前后缀这一说法.其他的例如nex

KMP算法的定义及KMP练手题 HDU 1711 Number Sequence (我的模板代码)

题意:就是要你来找出b数组在a数组中最先匹配的位置,如果没有则输出-1 思路:直接KMP算法(算法具体思想这位牛写的不错http://blog.csdn.net/v_july_v/article/details/7041827) AC代码: #include<cstdio> #include<cstring> #include<stdlib.h> #include<iostream> using namespace std; #define maxn 100

KMP算法详解(图示+代码)

算法过程非常绕,不要企图一次就能看明白,多尝试就会明白一些.下面试图用比较直观的方法解释这个算法,对KMP算法的解释如下: 1. 首先,字符串"BBC ABCDAB ABCDABCDABDE"的第一个字符与搜索词"ABCDABD"的第一个字符,进行比较.因为B与A不匹配,所以搜索词后移一位. 2. 因为B与A不匹配,搜索词再往后移. 3. 就这样,直到字符串有一个字符,与搜索词的第一个字符相同为止. 4. 接着比较字符串和搜索词的下一个字符,还是相同. 5. 直到字