KMP-模式匹配

发板子~

struct KMP{//s为子串,t为原串
    static const int N=10100;
    int next[N];
    void getnext(char *s){
        int lens=strlen(s);
        next[0]=next[1]=0;
        for(int i=1;i<lens;i++){
            int j=next[i];
            while(j&&s[i]!=s[j])j=next[j];
            next[i+1]=s[i]==s[j]?j+1:0;
        }
    }
    int kmp(char *s,char *t){
        int lens=strlen(s),lent=strlen(t),ans=0;
        for(int i=0,j=0;i<lent;i++){
            while(j&&s[j]!=t[i])j=next[j];
            if(s[j]==t[i])j++;
            if(j==lens)ans++;//可重子串 else bu→j=0;
        }
        return ans;
    }
}kmp;

  

时间: 2024-11-04 17:26:23

KMP-模式匹配的相关文章

KMP模式匹配_2

http://blog.csdn.net/lin_bei/article/details/1252686 个人觉得这篇文章是网上的介绍有关KMP算法更让人容易理解的文章了,确实说得很“详细”,耐心地把它看完肯定会有所收获的--,另外有关模式函数值next[i]确实有很多版本啊,在另外一些面向对象的算法描述书中也有失效函数 f(j)的说法,其实是一个意思,即next[j]=f(j-1)+1,不过还是next[j]这种表示法好理解啊: KMP字符串模式匹配详解 KMP字符串模式匹配通俗点说就是一种在

KMP算法 KMP模式匹配 二(串)

B - KMP模式匹配 二(串) Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu Description 输入一个主串和一个子串,用KMP进行匹配,问进行几趟匹配才成功,若没成功,则输出0 Input 输入一个主串和一个子串 Output 匹配的趟数 Sample Input ababcabcacbab abcac

KMP算法 KMP模式匹配 一(串)

A - KMP模式匹配 一(串) Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu Description 求子串的next值,用next数组存放,全部输出 Input 输入一个字符串 Output 输出所有next值 Sample Input abaabcac Sample Output 0 1 1 2 2 3 1

KMP模式匹配

在开发中经常遇到需要查看一个字符串t是否在字符串s中存在,并找到其第一次出现的位置,也就是在字符串s中查找子串t,我们平常都是怎么实现那?我们最起码有三个方法可以用,CString和string中的find函数,以及string.h中的strstr函数,用起来既简单又快捷,CString是MFC中的东西,string是C++标准库的东西,strstr是C中string.h中的东西,貌似我们没必要非要自己实现定位查找功能--但是如果我偏要想自己实现那?我们能不能模仿MFC中的CString或者C+

_DataStructure_C_Impl:KMP模式匹配

#include<stdio.h> #include<stdlib.h> #include<string.h> #include"SeqString.h" /*函数的声明*/ int B_FIndex(SeqString S,int pos,SeqString T,int *count); int KMP_Index(SeqString S,int pos,SeqString T,int next[],int *count); void GetNex

KMP练习——KMP模式匹配 一(串)

Description 求子串的next值,用next数组存放,所有输出 Input 输入一个字符串 Output 输出全部next值 Sample Input abaabcac Sample Output 0 1 1 2 2 3 1 2 代码 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; void getNext(char

字符串模式匹配之KMP算法图解与 next 数组原理和实现方案

之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下. KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 i指针,而是利用已经得到的“部分匹配”的结果将模式子串向右“滑动”尽可能远的一段距离后,继续进行比较.如果 ok,那么主串的指示指针不回溯!算法的时间复杂度只和子串有关!很好. KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的,很自然的,需要一个函数来存储匹

KMP字符串模式匹配详解

KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n);KMP匹配算法.可以证明它的时间复杂度为O(m+n).. 一.简单匹配算法 先来看一个简单匹配算法的函数: int Index_BF ( char S [ ], char T [ ], int pos ) { /* 若串 S 中从第pos(S 的下标0≤pos个字符 起存在和串 T 相同的子串,则称匹配成功,返回第一个 这样的子串在串 S 中的下标,否则返回 -1    */ int

[转]模式匹配之Brute-Force、KMP

(Brute-Force)  一.与串相关的概念 1.串(或字符串)是由零个或多个字符组成的有限序列.一般记作:s="c0c1c2…cn-1"(n≥0).零个字符的串称为空串,通常以两个相邻的双引号来表示空串,仅由空格组成的的串称为空格串,如:s="    ": 2.串与线性表的异同.字符串一般简称为串,可以将它看作是一种特殊的线性表,这种线性表的数据元素的类型总是字符型的,字符串的数据对象约束为字符集.在线性表的基本操作中,大多以“单个元素”作为操作对象,而在串中

(转)KMP字符串模式匹配详解

(转)KMP字符串模式匹配详解 个人觉得这篇文章是网上的介绍有关KMP算法更让人容易理解的文章了,确实说得很“详细”,耐心地把它看完肯定会有所收获的--,另外有关模式函数值next[i]确实有很多版本啊,在另外一些面向对象的算法描述书中也有失效函数 f(j)的说法,其实是一个意思,即next[j]=f(j-1)+1,不过还是next[j]这种表示法好理解啊: KMP字符串模式匹配详解 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n)