KMP算法及KMP算法的应用(POJ2406)

///KMP算法#include<bits/stdc++.h>

using namespace std;

int Next[1000];

void makeNext(const char P[],int next[])
{
    int q,k;
    int len=strlen(P);
    next[0]=0;
    for(q=1,k=0;q<len;q++)
    {
        while(k>0&&P[q]!=P[k])
        {
            k=next[k-1];
        }
        if(P[q]==P[k])
        {
            k++;
        }
        next[q]=k;
    }
}

void KMP(const char P[],const char Q[],int next[])
{
    int len1,len2;
    int q,k;
    len1=strlen(P);
    len2=strlen(Q);
    makeNext(Q,next);
    for(q=0,k=0;q<len1;q++)
    {
        while(k>0&&P[q]!=Q[k])
        {
            k=next[k-1];
        }
        if(P[q]==Q[k])
        {
            k++;
        }
        if(k==len2)
        {
            printf("%d\n",q-len2+1);
        }
    }
}

int main()
{
    char P[100]=("asdfgasbnaslk");
    char Q[100]=("ababab");

    KMP(P,Q,Next);
    int n=strlen(Q);
    for(int i=0;i<n;i++)
    {
        printf("%d  ",Next[i]);
    }
    printf("\n");
    return 0;
}

KMP算法的应用

///http://poj.org/problem?id=2406
///求最小循环节
///next数组的理解与应用

//#include<bits/stdc++.h>
#include<iostream>
#include<string.h>
#include<stdio.h>

using namespace std;

char a[1000009];
int Next[1000009];

void makeNext(const char P[],int next[])
{
    int q,k;
    int len=strlen(P);
    next[0]=0;
    for(q=1,k=0;q<len;q++)
    {
        while(k>0&&P[q]!=P[k])
        {
            k=next[k-1];
        }
        if(P[q]==P[k])
        {
            k++;
        }
        next[q]=k;
    }
}

int main()
{
    while(scanf("%s",a)&&strcmp(a,".")!=0)
    {
        int l=strlen(a);
        makeNext(a,Next);
        if(l%(l-Next[l-1])==0)
            printf("%d\n",l/(l-Next[l-1]));
        else
            printf("1\n");
    }
    return 0;
}
时间: 2024-12-19 05:52:42

KMP算法及KMP算法的应用(POJ2406)的相关文章

BF算法与KMP算法

BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果. BF算法实现: 1 int BF(char S[],char T[],int pos) 2 {//c从第pos位开始搜索匹配 3 int i=pos,j=0; 4 while(S[i+j]!='\0'&&T[j]!='\0')

经典串匹配算法(KMP)解析

一.问题重述 现有字符串S1,求S1中与字符串S2完全匹配的部分,例如: S1 = "ababaababc" S2 = "ababc" 那么得到匹配的结果是5(S1中的"ababc"的a的位置),当然如果S1中有多个S2也没关系,能找到第一个就能找到第二个.. ------- 最容易想到的方法自然是双重循环按位比对(BF算法),但在最坏的情况下BF算法的时间复杂度达到了m * n,这在实际应用中是不可接受的,于是某3个人想出来了KMP算法(KMP

KMP查找子字符串算法

举例说明: S:  ababcababa P:  ababa KMP算法之所以叫做KMP算法是因为这个算法是由三个人共同提出来的,就取三个人名字的首字母作为该算法的名字.其实KMP算法与BF算法的区别就在于KMP算法巧妙的消除了指针i的回溯问题,只需确定下次匹配j的位置即可,使得问题的复杂度由O(mn)下降到O(m+n).  在KMP算法中,为了确定在匹配不成功时,下次匹配时j的位置,引入了next[]数组,next[j]的值表示P[0...j-1]中最长后缀的长度等于相同字符序列的前缀.  对

字符串匹配——朴素算法、KMP算法

字符串匹配(string match)是在实际工程中经常会碰到的问题,通常其输入是原字符串(String)和子串(又称模式,Pattern)组成,输出为子串在原字符串中的首次出现的位置.通常精确的字符串搜索算法包括朴素搜索算法,KMP, BM(Boyer Moore), sunday, robin-karp 以及 bitap.下面分析朴素搜索算法和KMP这两种方法并给出其实现.假设原字符T串长度N,子串P长度为M. 1.NAIVE-STRING-MATCHING. 朴素算法,该方法又称暴力搜索,

算法学习-KMP(字符串匹配)解释

KMP算法 BF算法 BF算法就是我们最基本的求解字符串匹配的算法,算法的时间复杂度为O(M*N),空间复杂度为O(1),具体过程如下: 串 第一次 第二次 第三次 第四次 模式串S[i] abcababc abcababc abcababc abcababc 匹配串T[j] ababc ababc ababc ababc 可以看到在第三次匹配失败的时候,我们要回溯,直接S串直接i+=1,然后T串j=0从头继续开始.这样复杂度就比较高了. KMP算法 而KMP算法就是为了解决BF算法的复杂度比

串、串的模式匹配算法(子串查找)BF算法、KMP算法

串的定长顺序存储#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断 串的模式匹配: 串的定义:0个或多个字符组成的有限序列S = 'a1a2a3--.an ' n = 0时为空串串的顺序存储结构:字符数组,串的长度就是数组末尾'\0'前面的字符个数数组需在定义时确定长度,有局限性数组的最大长度二:串的堆分配存储表示typedef struct { char *ch; //若是非空串,则按串长分配存储区 //否则ch为空 int length; //串长度}HS

浅谈字符串算法(KMP算法和Manacher算法)

[字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述  字符串算法2:Manacher算法 问题:给出字符串S(限制见后)求出最大回文子串长度 Subtask1  对于10%的数据 |S|∈(0,100] Subtask2  对于30%的数据|S|∈(0,5000] Subtask3 对于100%的数据|S|∈(0,11000000] Subtask1(10pts):最朴素的暴力 枚举字符串的所有子串,判断其是否回文,时间复

KMP与扩展KMP

原文转自:http://www.cppblog.com/MatoNo1/archive/2011/04/17/144390.aspx KMP:给出两个字符串A(称为模板串)和B(称为子串),长度分别为lenA和lenB,要求在线性时间内,对于每个A[i] (0<=i<lenA),求出A[i]往前和B的前缀匹配的最大匹配长度,记为ex[i](或者说,ex[i]为满足A[i- z+1..i]==B[0..z-1]的最大的z值).KMP的主要目的是求B是不是A的子串,以及若是,B在A中所有出现的位置

KMP和扩展KMP【转】

这种东西基本上在纸上自己推导一下就能做出来XD 转发注明出处 KMP:给出两个字符串A(称为模板串)和B(称为子串),长度分别为lenA和lenB,要求在线性时间内,对于每个A[i] (0<=i<lenA),求出A[i]往前和B的前缀匹配的最大匹配长度,记为ex[i](或者说,ex[i]为满足A[i- z+1..i]==B[0..z-1]的最大的z值).KMP的主要目的是求B是不是A的子串,以及若是,B在A中所有出现的位置(当 ex[i]=lenB时).[算法]设next[i]为满足B[i-z

KMP与扩展KMP初探

KMP KMP算法主要用于字符串匹配中的单串匹配 next函数:表示当前字符失配时,应从模式串的第几位开始匹配(越大越好).即模式串的前缀与以t[i]为结尾的后缀的最长相同部分的长度. 代码如下(pascal) var s,t:string; next,ans:array[0..100] of longint; i,j:longint; begin readln(s); readln(t); next[1]:=0; {构造next} j:=0; for i:=2 to length(t) do