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

复习串的朴素模式匹配算法

模式匹配 :

子串定位运算,在主串中找出子串出现的位置。

在串匹配中,将主串 S 称为目标(串),子串 T 称为模式(串)。如果在主串 S 中能够找到子串 T, 则称匹配成功,返回 第一个 和 子串 T 中 第一个字符 相等 的 字符 在主串 S 中的 序号,否则,称匹配失败,返回 0。 

算法思想:

从主串 S 的第 pos 个字符起和模式 T 的第一个字符比较之,若相同,则两者顺次的去比较后续的每一个字符,否则从主串 S 的下一个字符起再重新和模式 T 的字符比较之。 (为什么说它朴素,就是因为笨,因子串和主串的每躺比较,当发现匹配不对,则主串的指针要回溯到上次开始比较的字符处的下一个字符处,去重新比一遍!费劲)。

详细图解;

给定两个字符串,S 和 T,长度已知。

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

初始 ab 相同,可以顺次比较,当3处,不匹配。则j 回溯到T1处,i 回到S 的下一个字符 S2处,从新开始和 T1比较。

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

b 和 a又不匹配,j 回到1处(位置不变),i 回到下一个字符,也就是3处,继续比,匹配,顺次比较之。直到下面;

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

模式串的 j再次回溯到1,i 到4,继续比较,不匹配,T 的 j 继续回溯1,S的 i 继续到下一个字符,继续比较,直到 i=6,匹配

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

继续顺次比较,直到 T 比完,也就是在 j=5,i=10之后,j、i 继续++的时候,要判断出比完了,如图。这是整个过程。算法重要的是思想,理解思想,是第一步,脑子里有清晰的思路和完美的情景再现,那么代码实现都是水到渠成的事情。

用代码编写如下:

 1 int getLength(char *str)
 2 {
 3     int i = 0;
 4     
 5     while ('