😀前言
字符串匹配是计算机科学中一个常见的问题,指的是在一个长字符串中查找一个短字符串的出现位置。在文本编辑、生物信息学、数据挖掘等领域都有着广泛的应用。
本文将介绍 KMP 算法,一种用于解决字符串匹配问题的经典算法。KMP 算法可以有效地减少不必要的比较次数,从而提高字符串匹配的效率。
🏠个人主页:尘觉主页
文章目录
- 数据结构面试常见问题之串的模式匹配(KMP算法)系列-上
- KMP-1. 问题及简单解决方案
- 什么是串
- 简单实现
- 简单改进
- 😄总结
数据结构面试常见问题之串的模式匹配(KMP算法)系列-上
KMP-1. 问题及简单解决方案
什么是串
- 线性存储的一组数据(默认是字符)
- 特殊操作集
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连支持一下,创造不易您们的支持是我的动力🤞