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;
}
- KMP算法详解 【KMP】
- 【KMP】KMP算法模板
- KMP hihoCoder1015 KMP算法
- kmp算法
- KMP算法
- KMP算法
- KMP算法
- KMP算法
- KMP 算法
- kmp算法
- KMP算法
- kmp算法
- KMP算法
- KMP算法
- kmp算法
- kmp算法
- KMP算法
- KMP算法
- How to install FlexPMD in Flex Builder 4.5
- Dynamic Router
- struts
- /proc 伪文件系统
- nfs网络文件系统挂载笔记整理1
- KMP算法
- Comet 与传统的 Ajax 轮询相比性能方面是否占优?
- CDN内容分发网络简介
- C# timer简单使用方法小结
- cocos2d-x跨android&ios平台开发入门教程part-1
- "苦逼"民工路
- Asp.Net数据控件引用AspNetPager.dll分页
- 多选框、单选框的使用
- struts文件下载