废话不多说,看毛片算法的核心在于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. CSS 3 过渡效果之jquery 的fadeIn ,fadeOut

    .div { visibility: hidden; opacity: 0; transition: visibility 0s linear 0.5s,opacity 0.5s linear; } ...

  2. visual studio 2012 链接Mysql 5.1

    首先在nuGet 下载MySql.Data.Entity 安装 mysql for visual studio http://www.mysql.com/why-mysql/windows/visua ...

  3. QTP11完美破解小笔记

    相比Loadrunner的破解,QTP的应该会更简单,但是效果并没有Loadrunner的长久.QTP的破解只能维持30天,每30天需要再进行如下操作: 1.到C:\ProgramData目录下面去删 ...

  4. VUE2.0实现购物车和地址选配功能学习第二节

    第二节 创建VUE实例 购物车项目计划: 1.创建一个vue实例 2.通过v-for指令渲染产品数据 3.使用filter对金额和图片进行格式化 4.使用v-on实现产品金额动态计算 5.综合演示 ① ...

  5. Linux 安装DenyHost防止ssh被暴力破解

    DenyHosts介绍 当你的linux服务器暴露在外网当中时,服务器就极有可能会遭到互联网上的扫描软件进行扫描,然后试图连接ssh端口进行暴力破解(穷举扫描).如果遇到这个问题,一款非常有用的工具D ...

  6. Debian部署RMI异常:java.rmi.ConnectException: Connection refused to host: 127.0.1.1;

    现象:在windows上部署RMI很顺利,但移到debian上部署后,客户端报异常: java.rmi.ConnectException: Connection refused to host: 12 ...

  7. Java并发之任务的描述和执行

    简单概念 <Java编程思想>对并发概念的重要性阐述: Java是一种多线程语言,并且提出了并发问题,不管你是否意识到了.因此,有很多使用中的Java程序,要么只是偶尔工作,要么是在大多数 ...

  8. ThinkPHP框架知识的注意点

    ThinkPHP框架 访问入口文件后在application文件夹中会出现一些文件夹,其中的home文件夹是前端模块,也可以在application文件夹中新建文件夹.home文件夹模块中Conf文件 ...

  9. UI 基本控件使用

    一>UITextFiled  ———>UITextField是什么 UITextField ( 输入框 ) : 是控制文本输入和显示的控件.在APP中UITextField 出现频率很高 ...

  10. js动态加载的蒙板弹框

    我们访问一些网站时总会遇到这种点击后,背景像被打上一层模板一样,这个是怎么做到的呢? 它是将这个弹框div独立于页面容器wrap,设置position为absolute,将其水平垂直之后都居中,设置弹 ...