0050 KMP匹配算法的C++实现

原创 2016年06月02日 11:34:11

引言:

    KMP模式匹配算法在搜索与索引中是算法基础(?)

    KMP匹配分两步:

1)根据要查找的字符串计算出next值;

2)利用next值来控制移动位置,实现高效匹配,不做多余的比较。

#include <iostream>
#include<string>
using namespace std;
//产生next值
void genKMPNext(int* next,string s)
{
	int i=0;
	int j=-1;
	next[0] = -1;
	while(i<s.length()-1)
	{
		while(j>=0&&s[i] != s[j])
			j = next[j];
		i++;
		j++;
		if(s[i] ==s[j])
			next[i] = next[j];
		else
			next[i] = j;
	}
}
//利用next值进行KMP算法
int KMP(string cs,string s)
{
	int i;
	int j;
	int *next = (int*)malloc(sizeof(int)*s.length());

	genKMPNext(next,s);

	for (i=0,j=0;i<s.length()&&j<cs.length();  )
	{
		if (s[i]==cs[j])
		{	i++;
			j++;
		}
		else if(next[i]>=0)
			i = next[i];
		else
		{
			i=0;j++;
		}
	}
		if(i>=s.length())
			return j-s.length();
		else
			return -1;
}
//主函数部分
int main()
{
    string cs="googlegood";  //一个长字符串
	string s="good";                //目标串,即要在cs中寻找的字符串
	int pos=KMP(cs,s);   //找完后记录在cs的某个位置起
	if(pos>=0)
		cout<<"你匹配的字符串存在于原字符串的第"<<pos+1<<"个位置开始"<<endl;
	else
		cout<<"你匹配的字符串不存在"<<endl;

    return 0;
}

当s="god"

---------------------------------------------------------2016.6.4更新,互动性地模式匹配-------------------------------

在ubuntu14.04编程实现:

#include<string>
#include<iostream>
#include<stdlib.h>
using namespace std;

void genNext(int *next,string s)
{
	int i=0;
	int j=-1;
	
	next[0] = -1;
	
	while(i<s.length()-1)
	{
		while(j>=0&&s[i]!=s[j])
			j = next[j];
		i++;
		j++;
		if(s[i]==s[j])
			next[i] = next[j];
		else
			next[i] = j;
	}
}

int Find(string cs,string s)
{
	int i,j,*next = (int*)malloc(sizeof(int)*s.length());
	genNext(next,s);

	for(i=0,j=0;i<s.length()&&j<=cs.length(); )
		{
			if(s[i]==cs[j])
			{i++;j++;}
			else if(next[i]>=0)
			i=next[i];
			else
			{i=0;j++;}
			
		}
	if(i>=s.length())
		return j-s.length();
	else
		return -1;

}


int main()
{
	string cs;  
	string s; 
	cout<<"请输入原始字符串:"<<endl;
	cin>>cs;
	cout<<"请输入要查找的子字符串:"<<endl;
	cin>>s;
	int len =s.length();
	int next[len];
	int pos = Find(cs,s);
	if(pos>=0)
	cout<<"所匹配的字符在原字符串从左往右数的第"<<pos+1<<"个位置开始出现"<<endl;
	else
	cout<<"你所匹配的字符串在源字符串中不存在"<<endl;
	
	return 0;
}



匹配上和没匹配上的结果显示为:


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

C++数据结构字符串及KMP匹配算法

  • 2016年01月03日 09:14
  • 11KB
  • 下载

Kmp字符匹配算法优化C++实现

C++实现Kmp字符匹配算法的优化版   头文件:KmpAlgorithm.h #ifndef KMPALGORITHM_H #define KMPALGORITHM_H #include ...

KMP模式匹配算法程序(Python,C++,C)

代码来自维基教科书:Knuth-Morris-Pratt pattern matcher。 Python程序如下: # Knuth-Morris-Pratt string matching # Dav...

KMP模式匹配算法(C++)

看了一天了,感觉有点恶心

C++ 改进的KMP模式匹配算法

我们在处理数据的过程中,总会遇到处理字符串的问题,现在贴上字符串匹配算法改进的KMP代码及实验结果,大家一起学习。 KMP算法主要是在于为了减少重复比较的次数而计算了一个next[]数组值,...

GUI之KMP字符匹配算法

  • 2017年10月18日 23:13
  • 50KB
  • 下载

KMP,BF匹配算法

  • 2013年10月29日 16:32
  • 3KB
  • 下载

字符串匹配算法(KMP、BM和Sunday),及Python实现

 分类: Python/Ruby 这篇博客主要对三种字符串匹配算法(KMP、BM、Sunday)进行总结。这三种字符串匹配算法之间的主要区别在于:如果在匹配过程中遇到一个不匹配位,该用...

字符串KMP匹配算法

  • 2013年12月01日 11:37
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:0050 KMP匹配算法的C++实现
举报原因:
原因补充:

(最多只允许输入30个字)