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

模式匹配 :

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

在串匹配中,将主串 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 ('\0' != str[i]) {
 6         i++;
 7     }
 8
 9     return i;
10 }
11
12 int strCompare(char *strMain, char *strSub, int index)
13 {
14     int iMain = index;
15     int jSub = 0;
16     int lenMain = getLength(strMain);
17     int lenSub = getLength(strSub);
18
19     while ((iMain >= 0 && iMain <= lenMain - 1) && ((jSub >= 0 && jSub <= lenSub - 1))){
20         if (strMain[iMain] == strSub[jSub]) {
21             iMain++;
22             jSub++;
23         }else{
24             iMain = iMain - jSub + 1;//回到主串的下一个位置起,开始比较,每次重新开始顺次比较, ij 走的长度是一样的,如果从0开始,那么相减之后,故+1到下一位,如果是从1开始存,那么+2到下一位。
25             jSub = 0;
26         }
27     }
28     //如果匹配 ok,肯定子串先比完。
29     if (jSub > lenSub - 1) {
30         return iMain - lenSub;//得到的就是匹配 ok 后,主串里第一个和模式串第一个字符匹配的字符的位置
31     }else{
32         return 0;//匹配失败
33     }
34 }
35
36 int main(int argc, const char * argv[]) {
37     char *str1 = "sawtsafvda";
38     char *str2 = "safv";
39
40     int i = strCompare(str1, str2, 0);
41
42     printf("%d\n", i);
43
44     return 0;
45 }

4

Program ended with exit code: 0

分析时间复杂度

最坏的时候,最后匹配成功,比如,0000000000001 和 00001 ,比较每次都在00001的1开始不匹配,指针回溯到开头,主串也回溯 i-j+1,若模式子串的长度是m,目标串的长度是n,这时最坏的情况是每遍比较都在最后出现不等,即每遍最多比较m次,最多比较n-m+1遍,总的比较次数最多为m(n-m+1),因此朴素的模式匹配算法为 o(m*n),虽然,朴素的模式匹配,时间复杂度比较大,但是实际中,一般情况(除非模式串和主串之间存在很多的部分匹配的时候,因为此时每遍需要比较的次数很多,相乘不能近似),真正的执行时间是近似于o(n+m )的,故当今仍然有他的用处!

辛苦的劳动,转载请注明出处,谢谢……
http://www.cnblogs.com/kubixuesheng/p/4322410.html

图解字符串的朴素模式匹配算法相关推荐

  1. 字符串的模式匹配 (朴素模式匹配算法 ,KMP算法)

    字符串的模式匹配 寻找字符串p在字符串t中首次出现的起始位置 字符串的顺序存储 typedef struct {char str[MAXSIZE];int length; }seqstring; 朴素 ...

  2. 字符串朴素模式匹配算法(简单模式匹配算法)

    字符串朴素模式匹配算法 一.朴素模式匹配算法(简单模式匹配算法)思想: 将主串中与模式串长度相同的子串搞出来,挨个与模式串对比 当子串与模式串某个对应字符不匹配时,就立即放弃当前子串,转而检索下一个子 ...

  3. 4.2.1朴素模式匹配算法

    什么是字符串的模式匹配: 从这段字符串里面搜索内容,被搜索的字符串我们称之为主串. 也可能匹配不到 主串长度为n,模式串长度为m. 朴素模式匹配算法:将主串中所有长度为m的字串依次与模式串对比,直到找 ...

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

    一.什么是字符串的模式匹配? 字符串模式匹配:在主串中找到与模式串相同的子串,并返回其所在位置. 注意: ①.子串--主串的一部分,一定存在. ②.模式串--不一定能在主串中找到 二.朴素模式匹配算法 ...

  5. 4. 串的【朴素模式匹配算法】、【KPM算法:求next数组、nextval数组】

    串的模式匹配:在主串中,找到与模式串相同的子串,并返回其所在位置. 其实就是给出一个串abc,找到abc在主串的位置[abc都要匹配] 模式串:给出一个串abc 子串:主串中的abc[可能没有] 文章 ...

  6. java中KMP模式_朴素模式匹配算法、kmp模式匹配算法、kmp模式匹配算法改进。java代码...

    ** 朴素模式匹配算法.kmp模式匹配算法.kmp模式匹配算法改进.java代码** 思路过段时间整理~ 可以先看看阮一峰的这篇博客,字符串匹配的KMP算法 package edu.hubu.base ...

  7. 蛮力法在字符串匹配问题中的应用(JAVA)--朴素模式匹配算法

    蛮力法在字符串匹配问题中的应用 字符串匹配问题通常是给定一个n个字符组成的串(称为文本),一个m(m<=n)个字符的串(称为模式),从文本中寻找匹配模式的子串.显然我们需要逐个匹配,这是蛮力算法 ...

  8. 朴素模式匹配与KMP模式匹配算法

    一.朴素模式匹配 朴素模式匹配算法 就是遍历主串,然后把待匹配字符串与子串进行比对,先把待匹配子串的第一个字母与主串进行匹配,若匹配成功,则两串的坐标依次 ++,匹配不成功时,主串坐标返回到开始匹配时 ...

  9. 【数据结构】字符串 模式匹配算法的理解与实现 Brute Force算法(BF算法)与KMP算法 (C与C++分别实现)

    #笔记整理 若不了解串的定义,可至: 串(string)的定义与表示 查看 串的模式匹配算法 求子串位置的定位函数 Index(S, P, pos) 求子串的定位操作通常称作串的模式匹配(其中子串P称 ...

最新文章

  1. “AI+”农业向农民致敬-丰收节交易会:谋定工业反哺农业
  2. 数据库分库分表、读写分离的原理和实现,以及使用场景
  3. jzoj3736-[NOI2014模拟7.11]数学题(math)【计算几何】
  4. mysql 联合索引 性能_mysql:联合索引及优化
  5. 程序员面试金典——1.6像素翻转
  6. OwinStartupAttribute
  7. ServletContextListener小小总结
  8. darknet 的python接口使用
  9. 白盒测试哪种测试效果好_白盒测试与黑盒测试区别(简答题)简短一些不要长的谢谢...
  10. 宝塔php7.1安装ioncube,如何使用宝塔安装ionCube扩展
  11. 破解tomcat管理员密码
  12. 2021/1/16-每日三题第23弹:skr小机灵鬼儿 ?你知道 JavaScript 中的原型和原型链是什么吗 ???
  13. powershell课后作业
  14. 最简单三级管振荡分析(自由多谐振荡器电路)
  15. Shiro视频-佟刚-专题视频课程
  16. ANSYS workbench数值分析 新手教程(1)
  17. cadence iscape如何下载文件?
  18. 武汉计算机考研好的学校排名,武汉排名前十的考研学校
  19. 海康工业相机LabVIEW二次开发——修改参数、存图
  20. Android studio 多渠道(多环境)打包grade配置详解

热门文章

  1. Linux安装Java、Maven、Mysql、RabbitMQ
  2. 全新 Hexo Material Design 主题 Mellow
  3. Hyper-V 配置网络 (高级篇)
  4. Object类中有哪些方法
  5. 索引维护存储过程(作业调用)
  6. [转]DB2常用命令大全
  7. 十招技巧将网络管理变成自动化
  8. matlab 如何被c 调用函数调用函数调用,c 调用 matlab engine 自定义函数
  9. 函数 —— popen() fscanf() sprintf() 执行shell命令并获取结果
  10. 在iframe内页触发顶层页面body的blur事件