【数据结构】模式匹配算法

一、模式匹配的概念

模式匹配是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出该字串相同的所有子串,这就是模式匹配。其中原字符串成为目标串,给定的子串为模式串。通俗理解如下图1-1:

【数据结构】模式匹配算法_第1张图片


二、常用的模式匹配算法

1、朴素的模式匹配算法(也称简单匹配算法,Brute-Force简称BF算法)

A.算法思想:

核心是穷举法。从目标串的的第一个字符起与模式串的第一个字符比较,若相等,则继续对字符进行后续的比较,否则目标串从第二个字符起与模式串的第一个字符重新比较,直至模式串中的每个字符依次和目标串中的一个连续的字符序列相等为止,此时称为匹配成功,否则匹配失败。

B.算法演示(给定目标串goodgoogle,模式串google)

【数据结构】模式匹配算法_第2张图片

C.代码实现

#include 
#include 
using namespace std;

int Match1(string str, string searchStr)
{
	int i = 0;
	int j = 0;
	while (i < str.size() && j < searchStr.size())
	{
		if (str[i] == searchStr[j])
		{
			i++;
			j++;
		}
		else//指针回退,重新开始匹配
		{
			i = i - j + 1;//目标串回到匹配位置的下一位置
			j = 0;//模式串回到起始0位置
		}
	}
	if (j >= searchStr.size())
	{
		return i - searchStr.size();//返回第一次匹配的首地址
	}
	else
	{
		return -1;
	}
}
int main(){
	string s = "goodgoogle";
	string t = "google";
	cout << Match1(s, t)<

D.算法分析

设目标串s的长度为n,模式串t的长度为m

最好情况下的时间复杂度O(m);

最差情况下的时间复杂度O(n*m);

平均时间复杂度O(n*m)。


2、KMP匹配算法

Knuth-Morris-Pratt算法(简称KMP),是由D.E.Knuth、J.H.Morris和V.R.Pratt共同提出的一个改进算法,消除了朴素的模式匹配算法中回溯问题,完成串的模式匹配。

A.算法思想:

设目标串为s,模式串为t, i、j 分别为指示s和t的指针,i、j的初值均为0。

若有 si = tj,则i和j分别增1;否则,i不变,j退回至j=next[j]的位置 ( 也可理解为串s不动,模式串t向右移动到si与tnext[j]对齐 );

比较si和tj。若相等则指针各增1;否则 j 再退回到下一个j=next[j]的位置(即模式串继续向右移动 ),再比较 si和tj。

依次类推,直到下列两种情况之一:

1)j退回到某个j=next[j]时有 si = tj,则指针各增1,继续匹配;

2)j退回至 j=-1,此时令指针各增l,即下一次比较 si+1和 t0

B.算法演示

【数据结构】模式匹配算法_第3张图片

【数据结构】模式匹配算法_第4张图片

【数据结构】模式匹配算法_第5张图片

 C.代码实现

#include
#include
using namespace std;
 
//计算子串的next数组
void get_next(string t, int *next)
{
	int i, j;
	i = 1;
	j = 0;
	next[1] = 0;
	while (i= t.size())
		return i - t.size();
	else
		return 0;
}
 
int main()
{
	string s = "#goodgoogle";
	string t = "#google";
	cout << KMP(s, t) << endl;
	return 0;
}

D.算法分析

对于长度为m的模式s和长度为n的目标t的模式匹配,KMP算法的时间复杂度为O(m+n)。

你可能感兴趣的:(【数据结构】模式匹配算法)