朴素模式匹配算法(C语言)

Posted bfhonor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了朴素模式匹配算法(C语言)相关的知识,希望对你有一定的参考价值。

一、什么是字符串的模式匹配?

  • 字符串模式匹配:在主串中找到与模式串相同的子串,并返回其所在位置。
  • 注意:
    ①、子串——主串的一部分,一定存在。
    ②、模式串——不一定能在主串中找到

    在这里插入图片描述

二、朴素模式匹配算法

在这里插入图片描述

  • 主串长度为n,模式串长度为m。
  • 朴素模式匹配算法:将主串中所有长度为m的子串依次与模式串匹配对比,直到找到一个完全匹配的子串,或所有的子串都不匹配为止。
  • 最多对比n-m+1个子串

(一)通过数组下标实现朴素模式匹配算法

在这里插入图片描述

  • 若当前⼦串匹配失败,则主串指针 i 指向下⼀个⼦串的第⼀个位置,模式串指针 j 回到模式串的第⼀个位置
  • j > T.length,则当前⼦串匹配成功,返回当前⼦串第⼀个字符的位置 —— i - T.length
int Index(SString S, SString T){
	int i=1,j=1;
	while(i <= S.length && j<=T.length){
		if(S.ch[i]==T.ch[j]){
			++i;
			++j;	//继续比较后继字符
		}
		else{
			i=i-j+2;
			j=1;	//指针后退重新开始匹配
		}
	}
	if(j > T.length)
		return i-T.length;
	else
		return 0;
}

(二)时间复杂度

  • 设主串⻓度为 n,模式串⻓度为 m,则
    ①、最坏时间复杂度 = O(nm)
    ②、最好时间复杂度 = O(n)

1. 最坏时间复杂度O(nm)

在这里插入图片描述

  • 最坏的情况,每个⼦串都要对⽐ m 个字符,共 n-m+1 个⼦串,复杂度 = O((n-m+1)m) = O(nm)
  • 注:很多时候,n >> m

2. 最好时间复杂度O(n)

在这里插入图片描述

  • 最好的情况,每个⼦串的第⼀个字符就匹配失败,共 n-m+1 个⼦串,复杂度 = O(n-m+1) = O(n)
  • 注:很多时候,n >> m

以上是关于朴素模式匹配算法(C语言)的主要内容,如果未能解决你的问题,请参考以下文章

算法基础 - 朴素模式匹配算法、KMP模式匹配算法

字符串之KMP算法(C语言)

图解字符串的朴素模式匹配算法

数据结构串---BF算法(朴素模式匹配)

字符串模式匹配KMP算法

(王道408考研数据结构)第四章串-第二节:串的模式匹配算法(朴素和KMP)