以下是本人根据上一篇博客随笔http://www.cnblogs.com/jiayouwyhit/p/3251832.html,所写的KMP算法代码(暂未优化),个人认为在基于上一篇博客的基础上,代码的思路是相对很清晰的。以后的KMP算法求解建议依照此版本进行代码构思。再次强调下本版本的next数组:

例如:

//    T = a b c a b c a b c d
//下标: 0 1 2 3 4 5 6 7 8 9
//next: -1 0 0 0 1 2 3 4 5 6
该版本的next数组的一个好处在于:字符串的下标是从零开始的,符合C++下string本身的特点;且另next[0]=-1,取值非常巧妙。
//新的KMP算法思路
int myNewKMP(const string& P,const string& T,const int* next)
{
int P_length = P.size(),T_length = T.size();
int i=,q=;//i----主串下标;q---子串下标号 while (i<P_length && q<T_length)
{
if(q==- || P[i]==T[q])
{
++i;
++q;
}
else{
q=next[q];
}
}
if(q==T_length)
return (i-T_length);
else
return -;
} //新的求next数组的思路
//next 数组举例示范:
// T = a b c a b c a b c d
//下标: 0 1 2 3 4 5 6 7 8 9
//next: -1 0 0 0 1 2 3 4 5 6
void myNewNext(const string & T, int *next)
{
int T_length=T.size();
int k=,q=;//k---前缀;q----后缀
next[]=-;
while (q<T_length)
{
if(k==- ||T[q]==T[k])//K==-1说明K=0了,T[k]!=T[q],故需将q往后移动,而K(也就是next[q])取值为0.
{
++q;
++k;
next[q]=k;
}
else
k = next[k];
}
}

//优化后的
void myNewNextUpdate(const string & T, int *next)
{
int T_length=T.size();
int k=,q=;//k---前缀;q----后缀
next[]=-;
while (q<T_length)
{
if(k==- ||T[q]==T[k])//K==-1说明K=0了,T[k]!=T[q],故需将q往后移动,而K(也就是next[q])取值为0.
{
++q;
++k;
//注意:注意这里是++i和++j之后的p[i]、p[j]
//修改:因为如果T[q]==T[k],则假如主串中某个字符与T[q]没有匹配上时,则把该字符与T[k]匹配将仍然是匹配不上的。
if(T[q]!=T[k])
next[q]=k;
else
next[q]=next[k];
}
else
k = next[k];
}
}

int main()
{
int i;
int shift = -;
int next[]={};
string P= "ababxbaaaabaaacfdsss";
string T = "aaabaaac";
cout<<"P="<<P<<endl;
cout<<"T="<<T<<endl; myNewNext(T,next);
if((shift = myNewKMP(P,T,next)) !=-)
cout<<"shift is "<<shift<<endl;
for (i = ; i< T.size(); ++i)
{
printf("%d ",next[i]);
}
printf("\n"); return ;
}

KMP算法代码的更多相关文章

  1. 【原创】KMP算法代码(C)

    //s是模式字符串,t是匹配字符串(可以看我上一篇文章中的叙述) int KMP(const char * s , const char * t) { int slen = strlen(s) , t ...

  2. Java KMP算法代码

    1. KMP 算法(字符串匹配算法)较 BF(朴素的字符串匹配)算法有哪些改进 1) 在主串和子串匹配的过程中,主串不再回退,只改变子串的比较位置. 2) 为子串生成对应的next数组,每次匹配失败, ...

  3. 【编程练习】kmp算法代码

    代码来自: http://blog.csdn.net/v_JULY_v #include "StdAfx.h" #include <iostream> using na ...

  4. KMP算法以及优化(代码分析以及求解next数组和nextval数组)

    KMP算法以及优化(代码分析以及求解next数组和nextval数组) 来了,数据结构及算法的内容来了,这才是我们的专攻,前面写的都是开胃小菜,本篇文章,侧重考研408方向,所以保证了你只要看懂了,题 ...

  5. 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 ...

  6. 查找子字符串----KMP算法深入剖析

    假设主串:a b a b c a b c a c b a b      子串:a b c a c 1.一般匹配算法 逐个字符的比较,匹配过程如下: 第一趟匹配 a b a b c a b c a c ...

  7. 利用KMP算法解决串的模式匹配问题(c++) -- 数据结构

    题目: 7-1 串的模式匹配 (30 分) 给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串 ...

  8. 字符串模式匹配算法1 - BF和KMP算法

    在字符串S中定位/查找某个子字符串P的操作,通常称为字符串的模式匹配,其中P称为模式串.模式匹配有多种算法,这里先总结一下BF算法和KMP算法. 注意:本文在讨论字符位置/指针/下标时,全部使用C语法 ...

  9. kmp算法模板及理解

    kmp算法是复杂度为O(n+m)的字符串匹配算法; 首先kmp算法的核心是在模式串中获得next数组,这个数组表示模式串的子串的前缀和后缀相同的最长长度; 这样在匹配的过程中如果指到不匹配的位置,模式 ...

随机推荐

  1. FFmpeg-20160418-snapshot-bin

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 F ...

  2. vmstat uptime 系统状态脚本

    #!/bin/bash # # Command :vmstat,uptime #Capture_Stats - Gather System Performance Statistics ####### ...

  3. 【python】Python遍历dict的key最高效的方法是什么?

    来源:https://segmentfault.com/q/1010000002581747 方法一:直接遍历 速度快 for key in _dict: pass 方法二:iterkeys() 速度 ...

  4. css 自动换行 [英文、数字、中文]

    white-space:normal;overflow: auto;table-layout:fixed; word-break: break-all;

  5. asp.net mvc在Model中控制日期格式

    这是默认的日期格式如下图:

  6. [Android Pro] AAR and JAR

    svn status svn log --limit 3 > RELEASE_NOTE.txt cat RELEASE_NOTE.txt pwd project_name_prefix=&quo ...

  7. python基础——访问限制

    python基础——访问限制 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑. 但是,从前面Student类的定义来看,外部代码还 ...

  8. 二维码相关工具Qrcode笔记

  9. Java中length,length(),size()区别

    length属性:用于获取数组长度. eg: int ar[] = new int{1,2,3} /** * 数组用length属性取得长度 */ int lenAr = ar.length;//此处 ...

  10. sshd_conf AllowUsers参数

    AllowUsers root user1 user2 #服务器只允许root user1 user2登录,再的新也用户产生,是不允许豋录服务器 配置文件在/etc/ssh/sshd_confing ...