废话不多说,看毛片算法的核心在于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. 定义 : angular view 和controller 之前的 ng-init 由谁来负责

    在设计view时,会需要default的值,这是会去下ng-init,但是如果发现ng-init没有,这时controller就会有. 概念是当ctrl要用时,就由ctrl负责.

  2. 读书笔记 effective c++ Item 25 实现一个不抛出异常的swap

    1. swap如此重要 Swap是一个非常有趣的函数,最初作为STL的一部分来介绍,它已然变成了异常安全编程的中流砥柱(Item 29),也是在拷贝中应对自我赋值的一种普通机制(Item 11).Sw ...

  3. Troubleshooting OpenStack 瘫痪 - 每天5分钟玩转 OpenStack(160)

    这是 OpenStack 实施经验分享系列的第 10 篇.是软件就会有 bug,OpenStack 也不例外,只要用它就一定会遇到故障.Troubleshooting(故障排除)是运维 OpenSta ...

  4. Java8中 Parallel Streams 的陷阱 [译]

    译注:文本有所精简和意译 原文链接 : Java Parallel Streams Are Bad for Your Health!原作者:OLEG SHELAJEV 翻译:Hason 转载请保留相关 ...

  5. UVa 1588 换抵挡装置

    前言 题目 大意是说,两个槽能够插在一起,并保证每一列的高度不高于3,保证最短长度. 思路 思路很简单,取短字符串遍历长字符串的每一个位置,纪录下位置,并取最短即可. 实现 //习题3-11 换抵挡装 ...

  6. SDWebImage下载图片的使用

    第一步,下载SDWebImage,导入工程.github托管地址https://github.com/rs/SDWebImage 第二步,在需要的地方导入头文件 1 #import "UII ...

  7. Maven工具的使用总结

    Maven作为构建工具,现在项目开发使用的越来越多,相对于ant和gradle,我更喜欢使用maven,先总结maven使用的一系列知识: 一.maven相关的网址: 名称 地址 其他 maven官网 ...

  8. 剑指offer_(4)

    重建二叉树: 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍 ...

  9. web从入门开始(2)----基础

    HTML文件结构 <html> <head>//网页头标记 <title>放置标题</title> </head> <body> ...

  10. [复习]java中hashCode的作用

    1.HashCode的官方文档定义 (1)hashcode方法返回该对象的哈希码值.支持该方法是为哈希表提供一些优点,例如java.util.HashTable提供的哈希表. (2)hashCode的 ...