废话不多说,看毛片算法的核心在于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. 关于select count

    关于select count,之前有一些不清楚的地方,看到阿里巴巴的Java编程规范,sql规约的第一条就是关于select count的 需要明确以下两点: 1.select count(常量)和s ...

  2. Laravel笔记目录

    一.MVC 1.路由 2.控制器与视图 3.控制器与路由的绑定 4.中间件 二.模式与数据库 1.数据库迁移 2.填充测试数据 3.ORM入门 4.分页 三.Laravel的生命周期 1.Larave ...

  3. ERP实施规范化及示例——邮件沟通

    上门服务前 上门服务计划,要详细,提前发给客户,反复确定双方的行程 上门服务所需的常规文档(培训SOP,培训记录) 项目组内反复确认本次上门要完成的事项 …… 上门服务中 先跟老板沟通项目进展,本次上 ...

  4. 强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning)

    强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning) 学习笔记: Reinforcement Learning: An Introductio ...

  5. Desktop Ubuntu 14.04LTS/16.04科学计算环境配置

    Desktop Ubuntu 14.04LTS/16.04科学计算环境配置 计算机硬件配置 cpu i5 6代 内存容量 8G gpu GTX960 显存容量 2G(建议显存在4G以上,否则一些稍具规 ...

  6. html表单 2017-03-10PM

    在写表单之前补充一点:网页名以及属性的值命名都不能用中文,尽量用英文或拼音. html表单特写 1.表单格式 <form method="get/post" action=& ...

  7. Linux系统常用命令总结

    1. 最关键的命令 manecho 2. 目录文件操作命令 ls: 查看目录下的文件信息或文件信息dir:pwd: 打印当前路径cd:改变路径mkdir:创建路径rmdir:删除路径cp:拷贝文件或目 ...

  8. 【Android】TextView跑马灯效果

    老规矩,先上图看效果. 说明 TextView的跑马灯效果也就是指当你只想让TextView单行显示,可是文本内容却又超过一行时,自动从左往右慢慢滑动显示的效果就叫跑马灯效果. 其实,TextView ...

  9. yii2.0下拉列表的使用

    第一种方法:ActiveForm 类的 dropDownList 方法(优点,默认使用yii的样式) 1.在控制器的方法里面 ,我们需要拿到数据,一定是 findAll() 或者是 all() 方法的 ...

  10. [UWP]了解模板化控件(2.1):理解ContentControl

    UWP的UI主要由布局容器和内容控件(ContentControl)组成.布局容器是指Grid.StackPanel等继承自Panel,可以拥有多个子元素的类.与此相对,ContentControl则 ...