KMP算法-C语言程序实现

原理参考ACM算法训练教程一书

//////////////////////////////////////////////////
/*KMP算法*/
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

void getNext(char a[],int next[]){
	int i,j;
	next[1] = 0;
	j = 0;
	i = 2;
	int m = strlen(a)-1; //从a[1]开始
	while(i<=m){
		if(a[j+1] == a[i]){
			j++; next[i++] = j;
		}
		else if(j==0){
			next[i++] = 0;
		}else if(j>0){
			j = next[j];
		}
	}
}
int match(char a[],char b[],int next[]){
	int i=0,j=0;
	int pos;
	int n = strlen(a)-1;
	int m = strlen(b)-1;
	while(1){
		if(i>n) {
			pos = -1; break;
		}
		if(j==m){
			//pos = i-j+1; break;
			cout<<i-j+1<<"  "<<endl; j=next[j];
		}
		if(b[j+1] == a[i+1] ){
			j++; i++;
		}else{
			if(j==0) i++;
			else if (j>0){
				j = next[j];
			}
		}
	}
}
/*
int main()
{
	//char b[] = "!ababbc";
	char b[] = "!abab";
	int l = strlen(b);
	int *next = new int[l-1];
	getNext(b,next);
	int i;
	for(i=1;i<=l-1;i++){
		printf("%d ",next[i]);
	}
	cout<<endl;
	char a[] = "!ababababbc";
	int pos = match(a,b,next);
	cout<<endl<<pos<<endl;
}
*/
//////////////////////////////////////////////////////
/*
KMP应用: 求一个串中所有前缀等于后缀的子串长度
*/
void output(int i,int next[]){
	while(next[i]>0){
		cout<<next[i]<<" ";
		i = next[i];
	}
}
/*
int main()
{
	char b[] = "!ababa";
	int l = strlen(b);
	int *next = new int[l-1];
	getNext(b,next);
	int i;
	for(i=1;i<=l-1;i++){
		printf("%d ",next[i]);
	}
	cout<<endl;
	output(l-1,next);
	delete[] next;
}
*/

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-10 21:29:57

KMP算法-C语言程序实现的相关文章

KMP和BF算法-C语言实现

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> //以下为KMP算法 void get_next(char * T, int next[]) //修正前的next数组 { int i = 1, j = 0; next[0] = -1; next[1] = 0; int m = strlen(T); while (i<strlen(T) - 1)

(转载)KMP算法详解(写的很好)

原文地址:http://www.cnblogs.com/yjiyjige/p/3263858.html KMP算法应该是每一本<数据结构>书都会讲的,算是知名度最高的算法之一了,但很可惜,我大二那年压根就没看懂过~~~ 之后也在很多地方也都经常看到讲解KMP算法的文章,看久了好像也知道是怎么一回事,但总感觉有些地方自己还是没有完全懂明白.这两天花了点时间总结一下,有点小体会,我希望可以通过我自己的语言来把这个算法的一些细节梳理清楚,也算是考验一下自己有真正理解这个算法. 什么是KMP算法: K

KMP算法解析(转自图灵社区)

KMP算法是一个很精妙的字符串算法,个人认为这个算法十分符合编程美学:十分简洁,而又极难理解.笔者算法学的很烂,所以接触到这个算法的时候也是一头雾水,去网上看各种帖子,发现写着各种KMP算法详解的转载帖子上面基本都会附上一句:“我也看的头晕”——这种诉苦声一片的错觉仿佛人生苦旅中找到知音,让我几乎放弃了这个算法的理解,准备把它直接记在脑海里了事. 但是后来在背了忘忘了背的反复过程中发现一个真理:任何对于算法的直接记忆都是徒劳无功的,基本上忘得比记的要快.后来看到刘未鹏先生的这篇文章:知其所以然(

KMP算法具体解释(转)

作者:July. 出处:http://blog.csdn.net/v_JULY_v/. 引记 此前一天,一位MS的朋友邀我一起去与他讨论高速排序,红黑树,字典树,B树.后缀树,包含KMP算法,只有在解说KMP算法的时候,言语磕磕碰碰,我想,原因有二:1.博客内的东西不常回想,忘了不少:2.便是我对KMP算法的理解还不够彻底,自不用说解说自如,运用自如了.所以,特再写本篇文章.因为此前,个人已经写过关于KMP算法的两篇文章,所以,本文名为:KMP算法之总结篇. 本文分为例如以下六个部分: 第一部分

KMP算法详解 --- 彻头彻尾理解KMP算法

[经典算法]——KMP,深入讲解next数组的求解 前言 之前对kmp算法虽然了解它的原理,即求出P0···Pi的最大相同前后缀长度k:但是问题在于如何求出这个最大前后缀长度呢?我觉得网上很多帖子都说的不是很清楚,总感觉没有把那层纸戳破,后来翻看算法导论,32章 字符串匹配虽然讲到了对前后缀计算的正确性,但是大量的推理证明不大好理解,没有与程序结合起来讲.今天我在这里讲一讲我的一些理解,希望大家多多指教,如果有不清楚的或错误的请给我留言. 1.kmp算法的原理: 本部分内容转自:http://w

KMP算法&amp;next数组总结

http://www.cnblogs.com/yjiyjige/p/3263858.html KMP算法应该是每一本<数据结构>书都会讲的,算是知名度最高的算法之一了,但很可惜,我大二那年压根就没看懂过~~~ 之后也在很多地方也都经常看到讲解KMP算法的文章,看久了好像也知道是怎么一回事,但总感觉有些地方自己还是没有完全懂明白.这两天花了点时间总结一下,有点小体会,我希望可以通过我自己的语言来把这个算法的一些细节梳理清楚,也算是考验一下自己有真正理解这个算法. 什么是KMP算法: KMP是三位

小谈KMP算法

刚接触KMP算法时,真是一头雾水,主要就是关于next跳转表是如何算出的,看了很久才勉强看明白,下面就是一点个人见解. 1.首先我要推荐先看这篇文章:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 看完这篇文章之后能明白kmp的主要思路是什么了 字符串匹配的KMP算法 作者: 阮一峰 日期: 2013年5月 1日 字符串匹配是计算机的基本任务之一. 举例来说,有一个字

详解KMP算法

KMP算法应该是每一本<数据结构>书都会讲的,算是知名度最高的算法之一了,但很可惜,我大二那年压根就没看懂过~~~ 之后也在很多地方也都经常看到讲解KMP算法的文章,看久了好像也知道是怎么一回事,但总感觉有些地方自己还是没有完全懂明白.这两天花了点时间总结一下,有点小体会,我希望可以通过我自己的语言来把这个算法的一些细节梳理清楚,也算是考验一下自己有真正理解这个算法. 什么是KMP算法: KMP是三位大牛:D.E.Knuth.J.H.Morris和V.R.Pratt同时发现的.其中第一位就是&

跳跃表,字典树(单词查找树,Trie树),后缀树,KMP算法,AC 自动机相关算法原理详细汇总

第一部分:跳跃表 本文将总结一种数据结构:跳跃表.前半部分跳跃表性质和操作的介绍直接摘自<让算法的效率跳起来--浅谈"跳跃表"的相关操作及其应用>上海市华东师范大学第二附属中学 魏冉.之后将附上跳跃表的源代码,以及本人对其的了解.难免有错误之处,希望指正,共同进步.谢谢. 跳跃表(Skip List)是1987年才诞生的一种崭新的数据结构,它在进行查找.插入.删除等操作时的期望时间复杂度均为O(logn),有着近乎替代平衡树的本领.而且最重要的一点,就是它的编程复杂度较同类