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;
}



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


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

字符串匹配算法KMP详细解释——深入理解

1. 前言  字符串匹配是一个经典算法问题,展开来讲各类问题多达几十种,有名称的算法也不下三十种,所以需要深入学习的东西有很多。这次我们来探讨一个最简单的问题,假设现在随机输入一个长度为m的主串T,另...
  • FX677588
  • FX677588
  • 2016年12月04日 16:09
  • 3592

KMP字符串匹配算法解析

kmp算法为非常经典的字符串匹配算法。下面先讲解下最原始的字符串匹配方法,也就是暴力求解。时间复杂度为O(m*n) 下面举个例子讲解下暴力大法 如  12314123123b   match为12...
  • u010485491
  • u010485491
  • 2016年07月26日 09:07
  • 581

KMP算法 C++实现

#include #include #include using namespace std; void getNext(const string &substr, vector &next) ...
  • a363344923
  • a363344923
  • 2014年12月07日 15:41
  • 2083

KMP算法——C++实现版

// KMP.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #define I_N_MAX 10000 using ...
  • u012102306
  • u012102306
  • 2015年11月13日 22:52
  • 1411

<C/C++算法>字符串匹配---KMP算法

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配...
  • EbowTang
  • EbowTang
  • 2015年10月14日 19:14
  • 5892

C/C++——朴素的模式匹配算法和KMP模式匹配算法

朴素的模式匹配算法其实就是一个一个往下匹配,没有任何优化,在好的情况下时间复杂度为O(n+m),在最求的情况下时间复杂度为O((n-m+1)*m)。 代码实现://在主串s中找子串t,若找到返回字串...
  • sinat_36053757
  • sinat_36053757
  • 2017年04月30日 16:44
  • 351

KMP算法C++代码

KMP算法的思想一般数据结构书都有讲,没讲的话google一下,有很多文章解释了其思想。晚上写了写这个代码,虽然不难,但还是费了番功夫调试,出现的主要问题有:无符号整型数据与整型数据比较大小(让我越来...
  • majcos
  • majcos
  • 2006年10月08日 21:12
  • 8395

字符串匹配算法KMP Java实现

kmp算法的核心思想:先对搜索字串生成偏移对照表,匹配时从左向右依次比较(bm从右向左,号称比kmp更快),相等则文档和搜索字串的下标+1迭代,否则查表,定位最优的偏移位置(文档下标不变,搜索字串下标...
  • a386347993
  • a386347993
  • 2015年01月09日 10:49
  • 1054

KMP算法 串的模式匹配算法优秀总结

转载大神的博客受益匪浅 这几天学习kmp算法,解决字符串的匹配问题,开始的时候都是用到BF算法,(BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符...
  • ltyqljhwcm
  • ltyqljhwcm
  • 2016年05月20日 12:21
  • 1352

详细解读KMP模式匹配算法

首先我们需要了解什么是模式匹配? 子串定位运算又称为模式匹配(Pattern Matching)或串匹配(String Matching)。在串匹配中,一般将主串称为目标串,将子串称为模式串。本篇博客...
  • FightLei
  • FightLei
  • 2016年09月30日 16:54
  • 12900
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:0050 KMP匹配算法的C++实现
举报原因:
原因补充:

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