关闭

KMP模式匹配算法

270人阅读 评论(0) 收藏 举报
分类:

      之前写过模式匹配的算法,写的比较随意粗糙,该算法考的蛮多的,记录下来方便以后查阅,归根到底,模式匹配法的核心就是跳表的生成了,具体参阅《算法导论》。

#include <iostream>
#include <string>
using namespace std;
class KMP
{
public:
	void set_Nexttable(const char *pattern,const int &size)//得到模式串的完整前缀函数,由此得到跳转表
	{
		const int p_size=size;
		int *pi=new int[size];
		int k=0;
		pi[0]=0;
		for(int q=2;q<=p_size;q++)//q代表模式串的第几个元素,取下标时要减1;
		{
			while(k>0&&pattern[k]!=pattern[q-1])//!!!注意要减1
			{
				k=pi[k-1];
			}
			if(pattern[k+1]==pattern[q-1])
			{
				k++;
			}
			pi[q-1]=k;
		}

		//设置跳转表
		next_table=new int[size];
		for(int i=1;i<=p_size;i++)
		{
			next_table[i-1]=i-pi[i-1];
			cout<<next_table[i-1]<<"	";
		}
	}
	void KMP_match(const char *target,const char *pattern,const int size_target,const int size_pattern)
	{
		match_num=1;
		for(int i=0;i<size_target; )
		{
			int tem_i=i;
			for(int j=0;j<size_pattern;)
			{
				if(pattern[j]==target[tem_i])
				{
					if(j==size_pattern-1)
					{
						cout<<"第"<<match_num<<"次模式匹配成功!"<<endl;
						cout<<pattern<<endl;
						i=i+next_table[6];
						match_num++;
						break;
					}
					j++;//j代表当前匹配的个数
					tem_i++;
				}
				else
				{
					i=i+next_table[j];
					break;
				}
			}
		}
	}
private:
	int *next_table;
	int match_num;
};

int _tmain(int argc, _TCHAR* argv[])
{
	cout<<"请输入一个模式串:"<<endl;
	string pattern;
	cin>>pattern;
	KMP a;
	int size=pattern.size();
	a.set_Nexttable(pattern.data(),size);//设置模式匹配的跳表
	cout<<"请输入目标串:"<<endl;
	string target;
	cin>>target;
	int target_size=target.size();
	a.KMP_match(target.data(),pattern.data(),target_size,size);
	return 0;
}
     输出结果会显示匹配成功的次数(目标串包含几个模式串)
0
0
查看评论

串的模式匹配算法——KMP

声明 原文链接:http://www.inf.fh-flensburg.de/lang/algorithmen/pattern/kmpen.htm ; 原文的“text”翻译为主串,通常用S表示,长度为n; 原文的"pattern"翻译为模式串,通常用T表示,长度为m;...
  • felicitia
  • felicitia
  • 2013-04-18 17:57
  • 1483

KMP 模式匹配算法原理分析

1. KMP算法是一种线性时间复杂的字符串匹配算法,它是对BF算法(Brute-Force,最基本的字符串匹配算法的)改进。     对于给的的原始串S和模式串P,需要从字符串S中找到字符串P出现的位置的索引。     BF算法的时...
  • clam_clam
  • clam_clam
  • 2011-09-22 20:23
  • 4141

KMP模式匹配算法中next,nextval的分别实现

next数组定义: 对于这个定义,我的理解是从1~j-1中,前缀与后缀有n个相等,则next[j]=n+1。 例如:t="abcabaa" 当j=1时,next[1]=0。 当j=2时,从1~j-1,串为a,next[2]=1。 当j=3时,从1~j-1,串为ab,...
  • huanhuanxiaoxiao
  • huanhuanxiaoxiao
  • 2017-08-09 11:37
  • 230

模式匹配KMP算法(Java)

/********查找匹配字符串**********/ //最原始、复杂度最高的做法 //返回childstr在mumstr中第pos个字符之后的位置,如果不存在,则返回0 public int FindStr(String mumstr, String childstr, int pos) { ...
  • woliuyunyicai
  • woliuyunyicai
  • 2015-03-25 15:47
  • 1031

KMP模式匹配算法

在写KMP之前,先把暴力匹配,也就是BF算法先写一下 int BF(string s,string t) { unsigned int i,j; i=j=0; while(i<=s.size()-t.size()) { for(int k=...
  • q786127150
  • q786127150
  • 2013-10-26 22:02
  • 405

朴素和KMP模式匹配算法(Java)

朴素模式匹配算法 public class Test { //朴素模式匹配算法 public int Index(String s,String t,int pos){ int i = pos;//主串中第几个位置开始比较 int j = 0;...
  • scgaliguodong123_
  • scgaliguodong123_
  • 2015-10-18 15:44
  • 1651

kmp模式匹配算法

模式匹配就是在字符串string中寻找模式pat,c语言中有内置函数strstr。但是今天我学了更快的算法(线性时间复杂性!)——————KMP算法。 这个算法是用三个作者的名字命名的,分别是Knuth,Morris和Pratt。 首先要了解失配函数: f(j) = i当且仅当i 否则f(j...
  • huntererer
  • huntererer
  • 2016-03-10 15:20
  • 596

KMP模式匹配算法原理

数据结构真的好难学啊。。。 在硬啃了《数据结构与算法分析》的前几章后,我有点支撑不住了。。 目前在看程杰老师的《大话数据结构》的电子版,内容相对比较通俗易懂。打算通过这本书先把数据结构的一些基本概念和原理理清楚,之后再来深入学习《数据结构与算法分析》。。 对于书中kmp模式匹配算法有些不懂,在看...
  • jinaoasher
  • jinaoasher
  • 2017-08-17 10:27
  • 81

数据结构--KMP模式匹配算法

ji 克努特-莫里斯-普拉特算法,简称KMP算法。
  • u010926176
  • u010926176
  • 2014-04-30 10:47
  • 1134

KMP模式匹配算法模板

#include<bits/stdc++.h> using namespace std;void InitNext(string T, int *next){ int i = 1, j = 0; next[1] = 0; while(i < T.size()...
  • robin_8
  • robin_8
  • 2017-01-09 12:37
  • 119
    个人资料
    • 访问:31153次
    • 积分:666
    • 等级:
    • 排名:千里之外
    • 原创:33篇
    • 转载:13篇
    • 译文:1篇
    • 评论:1条
    文章分类
    最新评论