我写的KMP 算法

原创 2004年05月07日 22:26:00

#include<iostream>
#include<time.h>
#include<string>
using namespace std;
void init(string ,string);
void show(char [],int);
int kmp(string ,string,int pos);
void get_next(char*,int *);
string s1,t1;
int m,n;
char *s;
char *t;
int *next;
/*************************MAIN**************************************/
int main(int argc[],char*args[])
{
   
 double t=clock();
 cout<<"找到位置为:"<<kmp("acbsabcaacabaabaabcacaabc","abaabca",1)<<endl;
    delete[] s;
 delete[] next;
 cout<<"耗时:"<<(clock()-t)/1000<<"毫秒!"<<endl;
 return 0;
}  
/**********************++++NEXT++++********************************/
void get_next(char s[],int ne[])
{
    ne =new int[n+1];
    next=new int[n+1];
    ne[0]=9999;
    int i(1),j(0);
    ne[1]=0;
    while(i<=(int)(t[0]))//数组是字符型的,要转化为整数
 {
     if(j==0||t[i]==t[j]){++i;++j;ne[i]=j;}
     else j=ne[j];
 }
   for( i=1;i<=n;i++)
   {
   cout<<"next["<<i<<"]="<<ne[i]<<endl;
      next[i]=ne[i];
   }
}
/********************++++KMP+++**********************************/
  int kmp(string s0,string t0,int pos)
  {
        init(s0,t0);
        int i=pos,j=1;
        while(i<=((int)(s[0]))&&(j<=((int)(t[0]))))
  {
         if((j==0)||(s[i]==t[j])){++i;++j;}
      else j=next[j];
        
  }
        if(j>(int)(t[0])) return i-((int)(t[0]));
        else return 0;

  }
/***************++++INIT+++*****************************************/
    void init(string ss,string tt)
 {
       //cout<<"请输入原串S=: "<<endl;
       //cin>>s1;
       //cout<<"请输入模式串T=:"<<endl;
       //cin>>t1;
       s1=ss;
       t1=tt;
       m=s1.length();
       n=t1.length();
       //if((s=(char*)malloc((m+1)*sizeof(char)))<0){cout<<"failed/n";return;}
       s=new char[m+1];
       s[0]=m;
       //if((t=(char*) malloc((n+1)*sizeof(char)))<0) {cout<<"failed/n";return;}
       t=new char[n+1];
       t[0]=n;
       for(int i=1;i<=m;i++)
      s[i]=s1.at(i-1);
       for( i=1;i<=n;i++)
         t[i]=t1.at(i-1);
        cout<<"原串为: ";    show(s,m);
     cout<<"模式串为: ";  show(t,n);
        get_next(t,next);
 }
/*******************++++SHOW+++**************************************/
       void show(char s[],int n )
    {
         for(int i=1;i<=n;i++)
         cout<<s[i]<<"  ";
         cout<<endl;
         cout<<"长度为: "<<int(s[0])<<"/n";
    }

KMP算法C#实现

next函数 求出模式串 向右滑动位数 将模式串的str的next函数值 存入 数组next static void GetNextVal(string str, int [] next)   ...
  • u013010416
  • u013010416
  • 2013年12月14日 16:18
  • 1591

python kmp算法简单实现

def getnext(a,next): al = len(a) next[0] = -1 k = -1 j = 0 while j < al-1: ...
  • u010041824
  • u010041824
  • 2017年04月26日 10:21
  • 535

字符串匹配算法KMP Java实现

kmp算法的核心思想:先对搜索字串生成偏移对照表,匹配时从左向右依次比较(bm从右向左,号称比kmp更快),相等则文档和搜索字串的下标+1迭代,否则查表,定位最优的偏移位置(文档下标不变,搜索字串下标...
  • a386347993
  • a386347993
  • 2015年01月09日 10:49
  • 1054

KMP算法(Python实现)

BF算法的时间复杂度:在最坏的情况下,BF算法要将目标串的每一个字符同模式串进行比较一遍,假定目标串长度为m,模式串长度为n,总的时间复杂度为O(m*n)。而对于KMP算法,进行比较的时间复杂度为O(...
  • u010189459
  • u010189459
  • 2014年06月11日 16:33
  • 2843

飘逸的python - 字符串的KMP匹配算法

首先我们来看一下字符串的朴素匹配. 可以想象成把文本串s固定住,模式串p从s最左边开始对齐,如果对齐的部分完全一样,则匹配成功,失败则将模式串p整体往右移1位,继续检查对齐部分,如此反复. #朴素...
  • u010180339
  • u010180339
  • 2014年11月10日 11:20
  • 5183

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

字符串匹配一直是计算机领域热门的研究问题之一,多种算法层出不穷。字符串匹配算法有着很强的实用价值,应用于信息搜索,拼写检查,生物信息学等多个领域。 今天介绍几种比较有名的算法: 1. BF...
  • l953972252
  • l953972252
  • 2016年05月06日 13:43
  • 1610

如果你看不懂KMP算法,那就看一看这篇文章( 绝对原创,绝对通俗易懂)

KMP算法之浅显易懂的阐述!
  • u011564456
  • u011564456
  • 2014年03月09日 20:32
  • 6383

KMP算法——从入门到懵逼到了解

本博文参考http://blog.csdn.net/v_july_v/article/details/7041827 关于其他字符串匹配算法见http://blog.csdn.net/WINCOL/a...
  • HyJoker
  • HyJoker
  • 2016年04月19日 17:12
  • 10202

KMP(MP)算法详解

Written with StackEdit. 由于CSDN服务器的维护,我迫不得已地用了和CSDN版本相近的StackEdit. KMP算法,是一种字符串匹配的算法。当然,我们已经学过了一两种字符...
  • WenDavidOI
  • WenDavidOI
  • 2016年08月07日 18:44
  • 1580

【算法】KMP经典算法,你真的懂了吗?

有关KMP算法的书籍、帖子、博客铺天盖地,但是你真的能看懂?你知道为什么要有next数组,next数组到底什么意思,又该怎么求next数组,有了next数组之后又该怎样判断模式串和主串是否匹配成功?本...
  • gesanghuazgy
  • gesanghuazgy
  • 2016年08月15日 21:03
  • 1171
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:我写的KMP 算法
举报原因:
原因补充:

(最多只允许输入30个字)