当前位置:网站首页>字符串匹配(蛮力法+KMP)
字符串匹配(蛮力法+KMP)
2022-08-02 03:29:00 【clarkjs】
1. 问题描述:
给定一个文本串和一个模式串,查找模式串是否为文本串的连续子串,如果是,则返回文本串的第一个匹配子串中第一个字符的位置。(这个问题应用十分广泛,所有查询问题的实质都是类似于字符串匹配,匹配成功则表示文本中含有这句话)
2. 题解
(1)蛮力法

上图为字符串匹配问题的示意图,文本串T与模式串P,我们的目标是查找模式串P是否为文本串的连续子串。在学习算法之前,首先想到的肯定是蛮力法,也就是使用最暴力的方法解决问题(蛮力法一般是最容易想到的方法,但是也几乎是效率最低的),下面一起来看一下蛮力法的实现过程:
首先应该明确一点,如果以T[n-m]为首字符的文本串还是无法与模式串匹配,则必定匹配失败。我们的方法是从0 ~ n-m遍历每个字符,分别以该字符为首字符依次比较文本串与模式串,相等则继续向右比较直到模式串没有字符了,如果不相等则将 i + 1,即说明以 i 为首字符的串不能匹配模式串。该算法的时间复杂度为O(m*n).
BruteForceStringMatch(T[0...n-1],P[0...m-1])
// 该算法实现了蛮力字符串匹配
// 输入:一个n个字符的数组T[0...n-1]代表一段文本串
一个m个字符的数组P[0...n-1]代表一个模式串
// 输出:如果查找成功的话,返回文本串的第一个匹配字符串中第一个字符的位置,否则返回-1
for i 0 to n - m do
j 0
while j < m and P[j] = T[i + j] do
j j + 1
if j = m return i
return -1

(2) KMP算法
虽然KMP算法并非现有字符串匹配问题的最佳算法,但是却是数据结构中必学的算法,如果完全没接触过的小伙伴可以先去了解一下KMP算法。
KMP算法最大的优点就是没有回溯。没有回溯的模式匹配算法:用 S[i]与T[]匹配,若相等则往后继续匹配,否则就用S[i与T[next[i]]匹配,直至匹配成功或失败为止。
int Index_KMP (SString S, SString T, int pos) {
i= pos, j =1;
while (i<=S[0] && j<=T[0])
if (j==0 || S[i]==T[j]) {
i++; j++; }
else
j=next[j]; //i不变, j后退
if (j>t[0]) return i-t[0]; //匹配成功
else return 0; //返回不匹配标志
}
边栏推荐
- Acwing:哈夫曼树(详解)
- 博达工业云与阿里云对比
- 使用批处理脚本修改hosts文件
- GM7150 CVBS转BT656视频解码芯片详细内容及设计要求
- Spark MLlib特征处理 之 StringIndexer、IndexToString使用说明以及源码剖析
- 【Popular Science Post】Detailed explanation of MDIO interface
- 【Popular Science Post】UART Interface Communication Protocol
- 【树莓派入门(2)树莓派的远程控制】
- 无源域适应(SFDA)方向的领域探究和论文复现(第二部分)
- 兼容C51与STM32的Keil5安装方法
猜你喜欢

【科普贴】I2C接口详解——偏硬件解析

完全背包问题(动态规划)
![[Arduino connects the clock module to display the time on LCD1602]](/img/88/5baac76a24924d1cfd675ff5da830e.png)
[Arduino connects the clock module to display the time on LCD1602]

ArrayList LinkList效率对比

【Arduino 连接DHT11 湿度和温度传感器】

AD8307对数检波器

Out of memory error on GPU 0. Cannot allocate xxxGB memory on GPU 0, available memory is only xxx

MC1496乘法器

Website development plan research

78XX 79XX多路输出电源
随机推荐
三相同步发电机的空载短路的simulink仿真
连接本地MySql时出现2003-Can‘t connect to MySql server on ‘localhost‘(10061)
使用批处理脚本修改hosts文件
Arduino点亮数码管
龙讯LT6911系列C/UXC/UXB/GXC/GXB芯片功能区别阐述
C# 注释语法
Go中的一些优化笔记,简约而不简单
Industry where edge gateway strong?
Temporal action localization in untrimmed videos via Multi-stage CNNs SCNN论文阅读笔记
【科普贴】I2C接口详解——偏硬件解析
目标检测(一):R-CNN系列
GM8775C规格书,MIPI转LVDS,MIPI转双路LVDS分享
【Arduino connects SD card module to realize data reading and writing】
Temporal Segment Networks:Towards Good Practices for Deep TSN论文精读笔记
TimeSformer视频理解框架:视频理解中的Transformer
振芯科技GM8285C:功能TTL转LVDS芯片简介
[Arduino connected to GP2Y1014AU0F dust sensor]
【Popular Science Post】Detailed explanation of MDIO interface
《scala 编程(第3版)》学习笔记2
[Arduino uses a rotary encoder module]