数据结构面试常见问题之串的模式匹配(KMP算法)系列-简单解决方案

😀前言
字符串匹配是计算机科学中一个常见的问题,指的是在一个长字符串中查找一个短字符串的出现位置。在文本编辑、生物信息学、数据挖掘等领域都有着广泛的应用。
本文将介绍 KMP 算法,一种用于解决字符串匹配问题的经典算法。KMP 算法可以有效地减少不必要的比较次数,从而提高字符串匹配的效率。

🏠个人主页:尘觉主页

数据结构面试常见问题之串的模式匹配(KMP算法)系列-上

KMP-1. 问题及简单解决方案

什么是串

  1. 线性存储的一组数据(默认是字符)
  2. 特殊操作集

1.求串的长度
2.比较两串是否相等
3.两串相接
4.求子串
5.插入子串
6.匹配子串(有难度)
7.删除子串

什么是串的模式匹配
目标:给定一段文本,从中找出某个指定的关键字
例如从一本Thomas Love Peacock写于十九世纪的小说《Headlong Hall》中找到那个最长的单
词:
osseocarnisanguineoviscericartilaginonervomedullary
或者从古希腊喜剧《Assemblywomen》中找到一道菜的名字:
Lopadotemachoselachogaleokranioleipsanodrimhypotrimmatosilphioparaomelitokatakechy
menokichlepikossyphophattoperisteralektryonoptekephalliokigklopeleiolagoiosiraiobaphetr
aganopterygon

当我们文本是很长的时候,而指定的关键字也是一个很长的字符串的时候,模式匹配就不再是一件简单的事情了

在这里插入图片描述

Position PatterMatch(char *string,char *pattern)//position指位置
//模式匹配就是给定一段文本(string),给定一个模式(*pattern),我们要通过PatterMatch函数
来返回这个pattern里string第一次出现的位置

简单实现

方法1:C语言的库函数strstr

接口:char *strstr(char *string,char *pattern)
//返回的是char *这个类型的变量(指向某个字符的指针),变量里面存的是pattern这个字符串第一个字母在string出现的时候那个字母所在的位置
//一个小Demo
#include <stdio.h>
#include <string.h>//库要记得包含进来
typedef char* Position;//给char*重新起个名字,让不懂的人也可以知道返回的是一个位置
int main()
{
	char string[] = "This is a simple example.";
	char pattern[] = "simple";
	Position p = strstr(string,pattern);
	if( p == NotFound ) printf("Mot Found.\n");//能不能找到进行一个判断
	else printf("%s\n",p);
	return 0;
}
//输出:simple example.
//如果输入的找不到,就会输出一个空指针(#define NotFound NULL)

strstr的复杂度怎么样?要想知道这个问题我们就得了解一下strstr是怎么运行的
在这里插入图片描述

如上图,是两个指针指向两个变量的内容开头进行比对,第一个对上了对下一个,直到全部对上或者中途失败
的时候将pattern的a与string下一个字符继续比对,一直循环下去,直到比对完都没成功或者中途成功了就退出循环

若给定文本长度为 n,模式长度为 m,则库函数 strstr 的最坏时间复杂度是:T = O(n*m)
当我们的pattern比较小的时候,我们这个strstr库函数还是很好用的,当两者都不小的时候就得慎重了

简单改进

方法2:从末尾开始比
在这里插入图片描述
时间复杂度:T = O(n)//仅仅是根据上方的例子进行的改动,如果pattern = "aab"换成"baa"一样要芭比Q
所以这个改进是没啥作用的
因为篇幅过长下篇继续
第一篇–>数据结构面试常见问题之串的模式匹配(KMP算法)系列-简单解决方案

第二篇–>数据结构面试常见问题之串的模式匹配(KMP算法)系列-大师改进

第三篇–>数据结构面试常见问题之串的模式匹配(KMP算法)系列-大师改进实现以及原理

😄总结

KMP 算法是一种用于解决字符串匹配问题的经典算法,其核心思想是利用部分匹配表来记录模式串中已匹配字符的部分匹配信息,从而在匹配失败时跳过不必要的比较。

KMP 算法的时间复杂度为 O(n+m),其中 n 是主串的长度,m 是模式串的长度。与朴素算法相比,KMP 算法在模式串较长的情况下可以明显提高匹配效率。

祝福您面试顺利

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘觉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值