模式匹配

子串的定位操作通常称为串的模式匹配。模式匹配的应用很常见,比如在文字处理软件中经常用到的查找功能。我们用如下函数来表示对字串位置的定位:

int index(const string &Tag,const string &Ptn,int pos)

其中,Tag为主串,Ptn为子串(模式串),如果在主串Tag的第pos个位置后存在与子串Ptn相同的子串,返回它在主串Tag中第pos个字符后第一次出现的位置,否则返回-1。

BF算法

我们先来看BF算法(Brute-Force,最基本的字符串匹配算法),BF算法的实现思想很简单:我们可以定义两个索引值i和j,分别指示主串Tag和子串Ptn当前正待比较的字符位置,从主串Tag的第pos个字符起和子串Ptn的第一个字符比较,若相等,则继续逐个比较后续字符,否则从主串Tag的下一个字符起再重新和子串Ptn的字符进行比较,重复执行,直到子串Ptn中的每个字符依次和主串Tag中的一个连续字符串相等,则匹配成功,函数返回该连续字符串的第一个字符在主串Tag中的位置,否则匹配不成功,函数返回-1。

用C++代码实现如下:

[cpp] view plaincopyprint?
  1. /*
  2. 返回子串Ptn在主串Tag的第pos个字符后(含第pos个位置)第一次出现的位置,若不存在,则返回-1
  3. 采用BF算法,这里的位置全部以从0开始计算为准,其中T非空,0<=pos<=Tlen
  4. */
  5. int index(const string &Tag,const string &Ptn,int pos)
  6. {
  7. int i = pos;  //主串当前正待比较的位置,初始为pos
  8. int j = 0;   //子串当前正待比较的位置,初始为0
  9. int Tlen = Tag.size();  //主串长度
  10. int Plen = Ptn.size();  //子串长度
  11. while(i<Tlen && j<Plen)
  12. {
  13. if(Tag[i] == Ptn[j])   //如果当前字符相同,则继续向下比较
  14. {
  15. i++;
  16. j++;
  17. }
  18. else   //如果当前字符不同,则i和j回退,重新进行匹配
  19. {
  20. //用now_pos表示每次重新进行匹配时开始比较的位置,则
  21. //i=now_pos+后移量,j=0+后移量
  22. //则i-j+1=now_pos+1,即为Tag中下一轮开始比较的位置
  23. i = i-j+1;
  24. //Ptn退回到子串开始处
  25. j = 0;
  26. }
  27. }
  28. if(j >= Plen)
  29. return i - Plen;
  30. else
  31. return -1;
  32. }

调用上面的函数,采用如下代码测试:

[cpp] view plaincopyprint?
  1. int main()
  2. {
  3. char ch;
  4. do{
  5. string Tag,Ptn;
  6. int pos;
  7. cout<<"输入主串:";
  8. cin>>Tag;
  9. cout<<"输入子串:";
  10. cin>>Ptn;
  11. cout<<"输入主串中开始进行匹配的位置(首字符位置为0):";
  12. cin>>pos;
  13. int result = kmp_index(Tag,Ptn,pos);
  14. if(result != -1)
  15. cout<<"主串与子串在主串的第"<<result<<"个字符(首字符的位置为0)处首次匹配"<<endl;
  16. else
  17. cout<<"无匹配子串"<<endl;
  18. cout<<"是否继续测试(输入y或Y继续,任意其他键结束):";
  19. cin>>ch;
  20. }while(ch == 'y' || ch == 'Y');
  21. return 0;
  22. }

测试结果如下:

以上算法完全可以实现要求的功能 ,而且在字符重复概率不大的情况下,时间复杂度也不是很大,一般为O(Plen+Tlen)。但是一旦出现如下情况,时间复杂度便会很高,如:子串为“111111110”,而主串为 “111111111111111111111111110” ,由于子串的前8个字符全部为‘1’,而主串的的前面一大堆字符也都为1,这样每轮比较都在子串的最后一个字符处出现不等,因此每轮比较都是在子串的最后一个字符进行匹配前

为串的模式匹配。模式匹相关推荐

  1. 《数据结构》—— 串,KMP模式算法(转载)

    本文内容转载自: KMP 算法(1):如何理解 KMP KMP 算法(2):其细微之处 一:背景展开目录 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即 ...

  2. 《数据结构》实验报告四:串的模式匹配(BF算法、KMP算法)

    一.实验目的 1.了解串的基本概念. 2.掌握串的模式匹配算法的实现 . 二.实验预习 说明以下概念 1.模式匹配: 串的模式匹配就是子串的定位运算. 设有两个字符串 S 和 T ,S为主串(正文串) ...

  3. 串的模式匹配(KMP算法)

    [问题描述] 串的模式匹配算法实现(KMP算法) [输入形式] 第一行输入主串s: 第二行输入模式串t: 第三行输入起始位置pos: [输出形式] 输出模式串t的next值(以空格分隔) 输出模式匹配 ...

  4. 简单模式匹配算法——串的模式匹配

    一.对一个串中的某子串的定位操作称为 串的模式匹配: 二.模式串:待定位的子串 三.基本思想:从主串中的第一个位置起和模式串的第一个字符开始比较 如果相等,则继续比较后续字符: 如果不等,则从主串的第 ...

  5. 从病毒感染检测谈串的模式匹配

    病毒感染检测:串的模式匹配 BF.KMP算法 在网络入侵检测.计算机病毒特征码匹配以及DNA序列匹配等应用中都需要进行串的模式匹配.针对这个问题,书上讲了两种模式匹配的算法,即BF算法和KMP算法,下 ...

  6. [入门必看]数据结构4.2:串的模式匹配

    [入门必看]数据结构4.2:串的模式匹配 第四章 串 4.2 串的模式匹配 知识总览 4.2.1_朴素模式匹配算法 4.2.2_1_KMP算法 4.2.2_2_求next数组 4.2.3_KMP算法的 ...

  7. 数据结构 - 串的模式匹配

    模式串: 想要在主串中找到某个子串 串的模式匹配: 设有主串s和子串t, 子串t的定位就是在主串s中找到一个与子串t相等的子串 通常把主串s成为目标串, 把子串t成为模式串, 模式串在子串的定位称作模 ...

  8. 数据结构之串:串的模式匹配

    串:串的模式匹配 模式匹配的定义: 实现代码: 模式匹配的定义: 实现代码: int Index(SString S,SString T,int pos){int i = pos,j = 1;whil ...

  9. 串的模式匹配python

    (1)朴素的模式匹配算法 该算法也称为布鲁特--福斯算法,其基本思想是从主串的第一个字符起与模式串的第一个字符比较,若相等,则继续逐一对字符进行后续的比较,否则从主串第二个字符起与模式串的第一个字符重 ...

  10. 串的模式匹配(BF算法)

    [问题描述] 串的模式匹配算法BF的实现与应用. [输入形式] 第一行输入主串s: 第二行输入模式串t: 输入串中均不包含空格字符. [输出形式] 模式串在主串s中的出现的每一个位置序号.若一次都未匹 ...

最新文章

  1. 魔兽War3按键精灵Ⅱ(2012-9-4)
  2. Python是不是被严重高估了(转载)
  3. 【NetApp】关于Snapmirror强制停止的一点记录
  4. ajax图书管理案例
  5. java根据日期生成表主键_java 利用时间生成主键
  6. InnoDB行锁的实现分析
  7. XHTML 1.0 Tags 参考
  8. 计算机网络:NAT基本原理
  9. his系统存储服务器,关于HIS服务器及存储建设的前瞻性需求报告
  10. 如何创建一个数据科学项目? 1
  11. 《机器人学经典教程》——2.2 控制论
  12. Logistic Regression 之 Sigmoid
  13. Centos7 安装 Python3.9
  14. anguar4 共享服务在多个组件中数据通信
  15. poj 3071 Football 概率dp
  16. 【转载】Jquery中的$命名冲突的解决方案
  17. 【备忘】于仕琪的libfacedetection相关
  18. Latex排版图片样式
  19. 如何做好软件可靠性测试?
  20. Spark作业提交流程

热门文章

  1. 架构师必备!15个经典面试问题及回答思路
  2. js 获取两个数组的交集,并集,补集,差集(转载+收藏)
  3. 网络空间安全——2021软科中国大学专业排名
  4. 网络中断 rps xps 调优记录
  5. c++实现LSTM,ADAM优化,预测大写数字
  6. VirtualBox调试分辨率时遇到的问题
  7. xp系统启动时0x0000007B(0XF799A524,0XC0000034,0X00000000,0X00000000)错误
  8. python使用金山词霸的翻译功能(调试工具断点的使用)
  9. 计算机里pc是什么,什么是pc?pc是什么意思?
  10. python 处理阻尼正弦