KMP算法

来源:互联网 发布:python 贝叶斯分类 编辑:程序博客网 时间:2024/06/06 14:07

//target指代目标索引

//patten指代模板索引

 

#include<iostream>
#include<string>
 using namespace std;
 int match(const string& target,const string& pattern)
 {
     int target_length = target.size();
     int pattern_length = pattern.size();
     int target_index = 0;
     int pattern_index = 0;
     while(target_index < target_length && pattern_index < pattern_length)
     {
         if(target[target_index]==pattern[pattern_index])
         {
             ++target_index;
             ++pattern_index;
         }
         else
         {
             target_index -= (pattern_index-1);
             //target_index=target_index-patten_index+1 修改target_index 指代位置,并且指向下一位置

          pattern_index = 0;
         }
     }
     if(pattern_index == pattern_length)
     {
         return target_index - pattern_length; //修改位置,但不指向下一位置
     }
     else
     {
         return -1;
     }
 }
 int main()
 {
     cout<<match("banananobano","nano")<<endl;
     return 0;
 }

 

/*************************

获取next数组

*************************/

// kmp.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "string.h"


int _tmain(int argc, _TCHAR* argv[])
{
 char p[]="abcabx";
 int next[6];
 int j,k;
 next[0]=-1;
 j=0;
 k=-1;
 while(j<strlen(p)-1)
 {
  if(k==-1||p[j]==p[k])    //匹配的情况下,p[j]==p[k]
  {
   j++;
   k++;
   next[j]=k;
  }
  else                   //p[j]!=p[k]
   k=next[k];  
 }
 for(int m=0;m<strlen(p);m++)
 {
  printf("next[%d] is %d\n",m,next[m]);
 }
 
 return 0;
}

 KMP实现代码

// kmp.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "string.h"
/***********************************
int _tmain(int argc, _TCHAR* argv[])
{
 char p[]="ababaaaba";
 int next[sizeof(p)-1];
 int j,k;
 next[0]=-1;
 j=0;
 k=-1;
 while(j<strlen(p)-1)
 {
  if(k==-1||p[j]==p[k])    //匹配的情况下,p[j]==p[k]
  {
   j++;
   k++;
   next[j]=k;
  }
  else                   //p[j]!=p[k]
   k=next[k];  
 }
 for(int m=0;m<strlen(p);m++)
 {
  printf("next[%d] is %d\n",m,next[m]);
 }
 return 0;
}
************************************************/
#include <string.h>
#include<iostream>
using namespace std;
void get_nextval(const char* pattern,int next[])
{
 next[0]=-1;
 int k=-1,j=0;
 while(pattern[j]!= '\0')
 {
  if(k!=-1 && pattern[k]!= pattern[j])
   k=next[k];
  ++j;
  ++k;
  if(pattern[k]== pattern[j])
   next[j]=next[k];
  else
   next[j]=k;
 }
}
int KMP(const char *Text,const char* Pattern) //const 表示函数内部不会改变这个参数的值。
{
 if( !Text||!Pattern||  Pattern[0]=='\0'  ||  Text[0]=='\0' )//
  return -1;//空指针或空串,返回-1。
 int len=0;
 const char * c=Pattern;
 while(*c++!='\0')//移动指针比移动下标快。
 {    
  ++len;//字符串长度。
 }
 int *next=new int[len+1];
 get_nextval(Pattern,next);//求Pattern的next函数值

 int index=0,i=0,j=0;
 while(Text[i]!='\0'  && Pattern[j]!='\0' )
 {
  if(Text[i]== Pattern[j])
  {
   ++i;// 继续比较后继字符
   ++j;
  }
  else
  {
   index += j-next[j];
   if(next[j]!=-1)
    j=next[j];// 模式串向右移动
   else
   {
    j=0;
    ++i;
   }
  }
 }//while
 delete []next;
 if(Pattern[j]=='\0')
  return index;// 匹配成功
 else
  return -1;      
}

int main()//abCabCad
{
 char text[]="bababCabCadcaabcaababcbaaaabaaacababcaabc";
 char* pattern="abcaabc";
 //getNext(pattern,n);

 //get_nextval(pattern,n);

 cout<<KMP(text,pattern)<<endl;

 return 0;

原创粉丝点击