Chapter 4. 字符串 KMP算法

Chapter 4. 字符串 KMP算法

Sylvia‘s I.

讲的比较好的博客1博客2

表问窝,在窝翻遍全网的博客后,窝已经处于混乱状态……

Sylvia‘s II.

窝是贴代码的小能手……

//前方高能请注意//窝并不知道窝在说什么……#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
#define debug(x) cerr<<#x<<‘=‘<<x<<endl
#define MAXN1 1000006
#define MAXN2 1003
int Next[MAXN2];//next是c++11的保留字……
char target[MAXN1],pattern[MAXN2];//target主串(目标串),pattern模式串
int lenp,lent;//各字符串长度 

void GetNext(char p[],int lenp){//计算Next跳转数组
    int i,j=0;//j指向的是已经匹配的前缀
    Next[0]=0;//初始化
    Next[1]=0;//初始化……
    for (int i=1;i<lenp;i++){
        while (j&&p[i]!=p[j]) j=Next[j];//跟下面的函数怎么那么类似啊
        if (p[i]==p[j]) j++;
        Next[i+1]=j; //得到这一位的前缀后缀最长公共长度,
                       //放入下一位的Next数组
                       //为什么是下一位?嗯,先去了解一下Next数组吧
    }
}

void kmp (char t[],int lent,char p[],int lenp){//进行匹配
    int i,j=0;//i指向的是target,j指向的是pattern
    for (int i=0;i<lent;i++){
        while (j&&t[i]!=p[j]) j=Next[j];//失配,跳转
        if (t[i]==p[j]) j++;//某一字符匹配成功那么向后指一位
        if (j==lenp){//如果完全匹配成功
            printf("%d\n",i-lenp+2);//输出位置1,2,3,4……
            j=Next[j];//继续匹配
        }
    }
}
int main () {
    scanf("%s",target);
    scanf("%s",pattern);
    lenp=strlen(pattern);
    lent=strlen(target);
    GetNext(pattern,lenp);
    kmp(target,lent,pattern,lenp);
    for (int i=1;i<=lenp;i++)
     printf("%d ",Next[i]);//输出数组Next,窝就是咸的……
    return 0;
}


嫌疑人x献身

东野圭吾

“你我都不可能摆脱时钟的束缚,彼此都已沦为社会这个时钟的齿轮。

一旦少了齿轮,时钟就会出乱子。

纵然自己渴望率性而为,周遭也不容许我们这样做。

这虽然同时也让我们得到了安定,但失去自由也是不争的事实。”



Sylvia

二零一七年五月二十一日

时间: 2024-10-11 06:38:59

Chapter 4. 字符串 KMP算法的相关文章

字符串kmp算法详解

之前要研究aho-corasick算法 拖了好久  感觉自己博客要开始了!! aho-corasick算法依赖2元素: 1.Trie树解析,1个月前就已经写过博客分析过了. 2.KMP算法 此文重点介绍字符串KMP算法: 一开始说说普通模式算法("BF"算法)思路:模式串从主串的第一个字符开始匹配,每匹配失败,主串中记录匹配进度的指针 i 都要进行 i-j+1 的回退操作(这个过程称为"指针回溯"),同时模式串向后移动一个字符的位置.一次次的循环,直到匹配成功或者程

hdu 2594 java实现字符串KMP算法

Problem Description Homer: Marge, I just figured out a way to discover some of the talents we weren't aware we had. Marge: Yeah, what is it? Homer: Take me for example. I want to find out if I have a talent in politics, OK? Marge: OK. Homer: So I tak

字符串 - KMP算法

字符串算法中,字符串匹配是一个非常重要的应用.例如在网页中查找关键词,其实就是在对字符串匹配,也就是看一个主字符串中是否包含了一个子字符串. 而KMP算法在字符串匹配方法中一个很著名并且很聪明的算法,当然也确实比较难理解.甚至于有程序员因为无法理解KMP算法而直接改用暴力匹配.本身自己学算法起步较晚,第一次接触到KMP算法已经是研究生毕业一年了.虽然带着研究生的学历背景,但是刚开始看的时候依然是一脸懵逼.看了很多博主的讲解总算是明白了,所以在这篇博客中记录下来自己的理解,如果能帮助到别人也是万分

字符串的KMP算法替换

1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 6 7 class myString 8 { 9 private: 10 string mainstr; 11 int size; 12 void GetNext(string p,int next[]); 13 int KMPFind(string p,int next[]); 14 public: 15 myString(); 16 //~myS

字符串模式匹配KMP算法中的next数组算法及C++实现

一.问题描述: 对于两个字符串S.T,找到T在S中第一次出现的起始位置,若T未在S中出现,则返回-1. 二.输入描述: 两个字符串S.T. 三.输出描述: 字符串T在S中第一次出现的起始位置,若未出现,则返回-1. 四.输入例子: ababaababcbababc 五.输出例子: 5 六.KMP算法解析: KMP算法分为两步,第一步是计算next数组,第二步是根据next数组通过较节省的方式回溯来比较两个字符串. 网络上不同文章关于next数组的角标含义略有差别,这里取参考文献中王红梅<数据结构

Java数据结构之字符串模式匹配算法---KMP算法

本文主要的思路都是参考http://kb.cnblogs.com/page/176818/ 如有冒犯请告知,多谢. 一.KMP算法 KMP算法可以在O(n+m)的时间数量级上完成串的模式匹配操作,其基本思想是:每当匹配过程中出现字符串比较不等时,不需回溯指针,而是利用已经得到的"部分匹配"结果将模式向右"滑动"尽可能远的一段距离,继续进行比较.显然我们首先需要获取一个"部分匹配"的结果,该结果怎么计算呢? 二.算法分析 在上一篇中讲到了BF算法,

Java数据结构之字符串模式匹配算法---KMP算法2

直接接上篇上代码: 1 //KMP算法 2 public class KMP { 3 4 // 获取next数组的方法,根据给定的字符串求 5 public static int[] getNext(String sub) { 6 7 int j = 1, k = 0; 8 int[] next = new int[sub.length()]; 9 next[0] = -1; // 这个是规定 10 next[1] = 0; // 这个也是规定 11 // 12 while (j < sub.l

字符串与模式匹配(一)&mdash;&mdash;KMP算法

源码:kmp.cpp // KMP.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <IOSTREAM> using namespace std; #define BUF_SIZE 100 #define BUF_SIZE_2 200 /*****************************************************

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

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