废话不多说,看毛片算法的核心在于next数组。

很多地方用的都是严书上的方法来求解next数组,代码确实简洁明了,但是可能对于初学者来说不容易想到,甚至不是一下子能理解。(好了,其实我说的就是自己,别笑)

以下为严师太的代码,也是很多人用的

照着代码用手调试了一遍,确实厉害

但是就跟我看别人写的递归算法时,照着推一遍,能懂,但是自己想不到,水平低,怪我。

int Next(char *p,int * next)//课本
{
int s=0,i=1,j=0;
char *q=p;
while(*q!='\0')
{
s++;
q++;
}
s--;
next[1]=0;
while(i<s)
{
if(j==0||p[i]==p[j])
{
i++;
j++;
next[i]=j;
}
else j=next[j];
}
return 0;
}

  

这里本人贴一段自己经过一晚上思考得出来的思路,也许不完善,也许别人已经有过类似更好的,但是我只是想分享给初学者一点思路,希望共同进步。

 int Next(char *p,int * next)//p为模式串
{
char *q=p;
int i,j,k,l,s=,m=;
while(*q!='\0')
{
s++;
q++;
}
s--;//求出模式串的长度,这里依照书上的规定从下标为1的算起
q=p;
next[]=s;
next[]=;
next[]=;
for(i=;i<=s;i++)//所需求解的next数组元素个数
{
for(l=;l<=i-;l++)//每次最多进行i-2回循环,因为模式串第i个元素之前一共有i-1个元素,而i-1个元素至多有 i-2 对相等的元素
{
for(j=,k=j+l;j<=i--l;j++,k++)//从相等对数最多对的情况判断
{
if(q[j]!=q[k]){ m=; break;}//一旦出现不相等,直接跳出循环,进行下一次判断,并且把m置为0,表示这种情况不符合
}
if(m) break;//经过上面的循环,若m仍然为1,则代表符合情况,不用再判断相等对数更少的情况了,直接跳出求解下一个next数组中元素的值
m=;
}
next[i]=i-l;//此处是化简后的结果,可以自己演算一下。
}
return ;
}
过程如下:

KMP完整代码如下:
 #include <iostream>

 using namespace std;
#define MAX_SIZE 10 int Next(char *p,int * next)
{
char *q=p;
int i,j,k,l,s=,m=;
while(*q!='\0')
{
s++;
q++;
}
s--;
q=p;
next[]=s;
next[]=;
next[]=;
for(i=;i<=s;i++)
{
for(l=;l<=i-;l++)
{
for(j=,k=j+l;j<=i--l;j++,k++)
{
if(q[j]!=q[k]){ m=; break;}
}
if(m) break;
m=;
}
next[i]=i-l;
}
return ;
} int Index(char *S,char *T)
{
int next[MAX_SIZE],i=,j=,s=,t=,pos=;
char *p=S,*q=T;
while(*p!='\0')
{
s++;
p++;
}
s--;
while(*q!='\0')
{
t++;
q++;
}
t--;
Next(T,next);
while(i<=s&&j<=t)
{
if(j==) {i++;j++;}

       if(i > s)
        {
          break;
        }

         if(S[i]==T[j]){i++;j++;}
else j=next[j];
}
if(j>t)
{
pos=i-t;
cout<<"模式串在主串中第"<<pos<<"个位置匹配"<<endl;
return ;
}
if(i>s&&j<=t)
{
cout<<"模式串无法与主串匹配!"<<endl;
return ;
}
}
int main()
{
char *S1="#ababcabcacbab";
char *T1="#abcac";
char *S2="#www.FishC.com";
char *T2="#ww.";
char *S3="#bbsbbs.FishC";
char *T3="#bbsbbc";
char *S4="#00000000000000000001";
char *T4="#00000001";
Index(S1,T1);
Index(S2,T2);
Index(S3,T3);
Index(S4,T4);
return ;
}

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

  1. KMP算法代码

    以下是本人根据上一篇博客随笔http://www.cnblogs.com/jiayouwyhit/p/3251832.html,所写的KMP算法代码(暂未优化),个人认为在基于上一篇博客的基础上,代码 ...

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

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

  3. Java KMP算法代码

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

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

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

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

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

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

  7. 查找子字符串----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 ...

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

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

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

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

  10. kmp算法模板及理解

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

随机推荐

  1. 前端福利:使用Wallpaper Engine让自己的桌面炫酷起来

    Wallpaper Engine,是一款Steam上的特别特别炫酷的壁纸定制软件.它可以对你的桌面进行定制,可以使用视频,动画,网页等形式来替换壁纸. 注意到没,关键是可以使用Html格式的文件作为桌 ...

  2. MongoDB分布式

    结构: ShardServer1:27020 ShardServer2:27021 ShardServer3:27022 ShardServer4:27023 ConfigServer:27100 R ...

  3. Node.js~在linux上的部署

    我们以centOS为例来说说如何部署node.js环境 一 打开centos,然后开始下载node.js包 curl --silent --location https://rpm.nodesourc ...

  4. MySQL优化-一 、缓存优化

    body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10 ...

  5. javascript string对象方法总结

    1.anchor() 用于创建html锚,也就是a标签,()中可以带参数,是a标签的name属性值. var string="hello world"; document.writ ...

  6. C语言学习心得

    最近学习了C语言,打脑壳,很多东西不会用,没有概念,单点知识都懂,组合起来就不知道怎么弄了.慢慢来吧

  7. ceph-deploy install时,远端节点在执行apt-get update命令时失败

    环境 OS:Ubuntu 16.04 背景 使用ceph-deploy部署Ceph集群,调用ceph-deploy install命令在远端节点安装ceph环境,执行apt-get update命令时 ...

  8. Java对象序列化

    Java 1.1增添了一种有趣的特性,名为“对象序列化”(Object Serialization).它面向那些实现了Serializable接口的对象,可将它们转换成一系列字节,并可在以后完全恢复回 ...

  9. iOS多线程——GCD

    最近的项目遇到了很多多线程的问题,借此机会对GCD进行了一番学习并总结.首先说一下什么是GCD,GCD全称 Grand Central Dispatch,是异步执行任务的技术之一.开发者只需要定义想要 ...

  10. Android之XListView下拉刷新,更新网络美女图

    一.简介:   下拉刷新是一种特定的手动刷新交互,和其他的同类操作不同的地方在于它采用了更加直觉的下拉操作,所以它的交互足够清晰明显. 下拉刷新主要用在类似ListView这样的控件,设计下拉刷新有三 ...