KMP算法(改良版)

若原串中首字符与后续字符依次相同,则可以用next[1]取代后续的next[j]

改良后的KMP算法,在计算出next值的同时,如果a位字符与它next值指向的b位字符相等,则该a位的nextval就指向b位的nextval值,如果不等,则该a位的nextval值就是它自己a位的next值。

//KMP改良版 
#include <iostream>
using namespace std;
const int MAXSIZE = 255;
typedef struct{
	char ch[MAXSIZE+1];
	int length;
}SString;
void get_nextval(SString T, int *next);
int Index_KMP(SString S, SString T, int pos);
void put_String(SString &T);
int main()
{
	SString a, b;
	put_String(a);
	put_String(b);
	cout << Index_KMP(a, b, 1);
	return 0;
}
void get_nextval(SString T, int *nextval)
{
	int i = 1, j = 0;
	nextval[1] = 0;
	while (i < T.length)
	{
		if (j == 0 || T.ch[i] == T.ch[j])
		{
			i++;
			j++;
			if (T.ch[i] != T.ch[j])
				nextval[i] = j;
			else
				nextval[i] = nextval[j];
		}
		else
			j = nextval[j];
	}
}
int Index_KMP(SString S, SString T, int pos)
{
	int i = pos, j = 1;
	int next[255];
	get_nextval(T, next);
	while (i <= S.length && j <= T.length)
	{
		if (j == 0 || S.ch[i] == T.ch[j])
		{
			i++;
			j++;
		}
		else
			j = next[j];
	}
	if (j > T.length)
	return i - T.length;
	return 0;
}
void put_String(SString &T)
{
	int i;
	cin >> T.length;  //输入字符串长度 
	for (i = 1; i <= T.length; i++)
		cin >> T.ch[i];
}

阅读更多
想对作者说点什么? 我来说一句

jquery坦克大战改良版

2010年06月23日 13KB 下载

K M P 算 法 . p p t

2011年08月10日 2.29MB 下载

KMP算法算法 KMP算法 KMP

2010年05月22日 1KB 下载

KMP算法详解 KMP算法详解

2010年08月10日 33KB 下载

一键清除系统垃圾(改良版

2010年04月22日 924B 下载

IP归属地查询(改良版)源码下载

2011年04月27日 11KB 下载

KMP算法学习教程KMP算法学习教程

2011年05月19日 284KB 下载

没有更多推荐了,返回首页

不良信息举报

KMP算法(改良版)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭