Kmp 算法模板 C

/**
 * name:KMP
 * time:2012-11-22
 * 字符串快速匹配
 */
#include<stdio.h>
#include<string.h>
typedef struct seqstring{
	char string[100];
	int length;
}seqstring;

void getnext(seqstring p,int next[]){
	int i,j;
	next[0]=-1;//next[0]放上-1
	i=0;//指向字符串每个字符的指针
	j=-1;
	while(i<p.length){//没有到达结尾的话
		if(j==-1||p.string[i]==p.string[j]){//如果是第一个字符或遇到相同的字符
			i++;j++;next[i]=j;
 		}
		else
			j=next[j];
	}
	for(i=0;i<p.length;i++){//输出next[]值
		printf("%d ",next[i]);
	}
}

int kmp(seqstring t,seqstring p,int next[]){
	int i,j;
	i=j=0;
	while(i<t.length&&j<p.length){
		if(j==-1||t.string[i]==p.string[j]){
			i++;j++;
		}
		else
			j=next[j];
	}
	if(j==p.length) return i-p.length;
	else return -1;
}
int main(){
	seqstring t,p;
	int next[50];
	printf("please input string t:");
	scanf("%s",t.string);
	t.length=strlen(t.string);
	printf("please input string p:");
	scanf("%s",p.string);
	p.length=strlen(p.string);

	getnext(p,next);
	printf("\n%d\n",kmp(t,p,next));
}

  

时间: 2024-11-05 04:11:38

Kmp 算法模板 C的相关文章

hdu 1711 KMP算法模板题

题意:给你两个串,问你第二个串是从第一个串的什么位置開始全然匹配的? kmp裸题,复杂度O(n+m). 当一个字符串以0为起始下标时.next[i]能够描写叙述为"不为自身的最大首尾反复子串长度". 当发生失配的情况下,j的新值next[j]取决于模式串中T[0 ~ j-1]中前缀和后缀相等部分的长度, 而且next[j]恰好等于这个最大长度. 防止超时.注意一些细节.. 另外:尽量少用strlen.变量记录下来使用比較好,用字符数组而不用string //KMP算法模板题 //hdu

kmp算法模板及理解

kmp算法是复杂度为O(n+m)的字符串匹配算法; 首先kmp算法的核心是在模式串中获得next数组,这个数组表示模式串的子串的前缀和后缀相同的最长长度; 这样在匹配的过程中如果指到不匹配的位置,模式串用next数组进行跳转到符合的位置,而目标串不需要再往回匹配,为什么是最长的相同的前缀后后缀呢? 因为只有这样才能一边避免可能漏掉的位置,一边尽量不重复已经匹配的位置; getNext的函数: void getNext() { int k = -1,j = 0,len = strlen(str);

KMP算法模板

不懂的话推荐看这篇博客,讲的很清楚 http://blog.csdn.net/v_july_v/article/details/7041827 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int maxlen=1024; 6 char S[maxlen],T[maxlen],next[maxlen]; 7 void get_next(

KMP算法模板 求子串和模板串首先匹配的位置

1 #include <cstdio> 2 using namespace std; 3 4 const int MAXN = 1e6 + 10; 5 int nex[MAXN]; 6 int s[MAXN], t[MAXN]; 7 8 void get_nex(int lm) { 9 int i = 0, j = -1; nex[0] = -1; 10 while (i < lm) { 11 if (j == -1 || t[j] == t[i]) { 12 i++; j++; nex

KMP算法的定义及KMP练手题 HDU 1711 Number Sequence (我的模板代码)

题意:就是要你来找出b数组在a数组中最先匹配的位置,如果没有则输出-1 思路:直接KMP算法(算法具体思想这位牛写的不错http://blog.csdn.net/v_july_v/article/details/7041827) AC代码: #include<cstdio> #include<cstring> #include<stdlib.h> #include<iostream> using namespace std; #define maxn 100

算法模板——KMP字符串匹配

功能:输入一个原串,再输入N个待匹配串,在待匹配串中找出全部原串的起始位置 原理:KMP算法,其实这个东西已经包含了AC自动机的思想(fail指针/数组),只不过适用于单模板匹配,不过值得一提的是在单模板大量匹配待匹配串时,这个会有相当大的优势,AC自动机虽然好想一些,但是在这一类问题上的性价比就略低了 1 var 2 i,j,k,l,m,n:longint; 3 a:array[0..100000] of longint; 4 s1,s2:ansistring; 5 begin 6 readl

【模板】KMP算法

KMP算法用于字符串匹配 1 /*KMP*/ 2 #include<stdio.h> 3 #include<string.h> 4 char s1[1000005],s2[1005];//s1 为待匹配串,s2为模板串 5 int nxt[1005],n,m; 6 int main() 7 { 8 scanf("%s%s",s1+1,s2+1); 9 n = strlen(s1+1); m = strlen(s2+1); 10 nxt[1] = 0; int i

[模板]KMP算法

昨天晚上一直在调KMP(模板传送门),因为先学了hash[关于hash的内容会在随后进行更(gu)新(gu)]于是想从1开始读...结果写出来之后一直死循环,最后我还是改回从0读入字符串了. [预先定义被匹配文本串为s1,长度为m:匹配模式串为s2,长度为n] KMP算法在字符串匹配算法中时间复杂度比较优,可以做到在O(m+n)的时间内匹配,相对于无脑暴力匹配的O(m*n)复杂度而言要优很多. KMP算法的思路比较简单,即在匹配前对字符串进行预处理,用空间换时间,通过处理next数组来实现在部分

拓展KMP算法 入门+模板

拓展KMP算法入门 博客推荐 扩展KMP算法, 图很形象,代码写的也很清晰,下面的模板就是出自该博客文章. 拓展KMP是求母串S长度为n和子串T长度为m,求S的每一个后缀子串与T的前缀子串匹配的最长长度. 代码实现 //求解模式串T的next数组,这个函数和下面的函数几乎相同 void getnext(string &T, int m, int[] next) { int a = 0, p = 0; next[0] = m; //T字符串自身和自身匹配 for(int i=1; i<m; i