本篇主要讲字符串匹配以及字符串算法中三个主要算法的一些内容,帮助大家理解。

一、基本概念

字符串匹配问题

假设文本是一个长度为n的数组T[1…n],而模式是一个长度为m的数组P[1…m],其中m≤n,进一步假设P和T的元素都是来自一个有限的字母集∑的字符。数组T和P通常被称为字符串。

如果0≤s≤n−m,并且T[s+1…s+m]=P[1…m],那么称模式P在文本T中出现过,且偏移为s。如果P在T中以偏移s出现,那么称s为有效偏移,否则为无效偏移。

字符串匹配问题就是在T中找到P的所有有效偏移s。


二、字符串匹配算法

字符串匹配算法

(1)BF算法

BF算法,即暴风(Brute Force)算法,也叫暴力破解法,是普通的模式匹配算法。

算法思想:将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。

时间复杂度:O(n*m)

int BF_match(char *T,char *P){
	int i = 0, j = 0;
	for (; T[i] != '\0' && P[j] != '\0'; i++)
		if (T[i] == P[j])
			j++;
		else
		{
			i -= j;
			j = 0;
		}
	if (P[j] == '\0') return i - j;
	else return -1;
}

(2)BM算法

Boyer-Moore字符串搜索算法是一种非常高效的字符串搜索算法。它由Bob Boyer和J Strother Moore设计于1977年。

算法思想:用坏字符表(BS)记录每个字符在模式串中最后的位置,用好后缀表(GS)记录模式串中与后缀匹配的位置,当匹配失败时,取二者中最大的位移量移动,减少字符对比次数

时间复杂度:O(n/m)~O(n+m)


(3)KMP算法

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的。

算法思想:用next数组存储当前字符之前的字符串前、后缀最长公共元素长度,匹配失败时通过next数组偏移

时间复杂度:O(n+m)


算法

效率

优点

缺点

适用环境

BF

O(n*m)

简单实现

效率低

仅简单字符串匹配,不要求效率的情况

BM

O(n/m)~O(n+m)

效率极高

前期准备工作量大

文本串较长的情况

KMP

O(n+m)

效率高、稳定性强

无明显短板

要求稳定性或文本串较短的情况


点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)