字符串匹配:字符串中查找某子串

  • 需求
  • 具体算法
    • 常规方法
      • 程序
    • KMP算法
      • 程序
    • 后续

需求

我们在平时的软件开发,尤其是嵌入式开发,字符串匹配是非常重要的一个算法。而目前常用的字符串匹配算法有很多,下面就来介绍几个。

具体算法

常规方法

对于字符串存放在字符数组的定长顺序存储结构中,可以利用计数指针指示主串和模式串当前正在比较的字符位置。算法的基本思路是:从主串的第i个字符起和模式串的第一个字符比较。若相等,则继续比较后续字符;否则从主串的下一个字符起再重新和模式串的第一个开始比。知道模式串被比较完成,代表主串中存在模式串。

程序

int index(string S,stringT,int pos)
{int i,j;i=pos;j=1;while(i<=S[0]&&j<=T[0]){if(S[i]==T[j]){++i;j++;}else{i=i-j+2;j=1;}}if(j>T[0])return i-T[0];else return 0;}

KMP算法

KMP算法又称为克努特—莫里斯—普拉特操作,是一种效率非常高的字符串匹配算法。KMP算法是一种改进的字符串匹配算法,其关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。此算法可以在O(n+m)的时间数量级上完成串的模式匹配操作。其算法的思路在于:每当一趟匹配过程中出现字符比较不等时,不需要回溯指针,而是利用已经得到的“部分匹配”的结果将模式向右“滚动”尽可能远的一段距离后,继续进行比较。

我们首先要明确一个概念,字符串最长前-后缀。
举例,字符串 abcdab
前缀的集合:{a,ab,abc,abcd,abcda}
后缀的集合:{b,ab,dab,cdab,bcdab}
那么最长前-后缀就是ab。

而KMP算法将最长前-后缀概念用在了next数组上。
next 数组各值的含义:代表当前字符之前的字符串中,有多大长度的相同前缀后缀。例如如果next [j] = k,代表j 之前的字符串中有最大长度为k 的相同前缀后缀。
这就意味着在某个字符失配时,该字符对应的next 值会告诉你下一步匹配中,模式串应该跳到哪个位置(跳到next [j] 的位置)。如果next [j] 等于0或-1,则跳到模式串的开头字符,若next [j] = k 且 k > 0,代表下次匹配跳到j 之前的某个字符,而不是跳到开头,且具体跳过了k 个字符。

程序

首先我们需要求next数组

typedef struct
{   char data[MaxSize];int length;          //串长
} SqString;
void GetNext(SqString t,int next[])     //由模式串t求出next值
{int i,k;i=0;k=-1;next[0]=-1;//第一个字符前无字符串,给值-1while (i<t.length-1) {   if (k==-1 || t.data[i]==t.data[k])  //k为-1或比较的字符相等时{    i++;k++;next[i]=k;}else{k=next[k];}}
}

KPM算法

int KMPIndex(SqString s,SqString t)
{int next[MaxSize],i=0,j=0;GetNext(t,next);while (i<s.length && j<t.length) {if (j==-1 || s.data[i]==t.data[j]) {i++;j++;           //i,j各增1}else j=next[j];       }if (j>=t.length)return(i-t.length);    //返回匹配模式串的首字符下标else  return(-1);                //返回不匹配标志
}

后续

如果想了解更多物联网、智能家居项目知识,可以关注我的程序设计专栏。
订阅专栏后,可以在微信公众号上私聊我。

编写不易,感谢支持。

字符串匹配:字符串中查找某子串相关推荐

  1. c 语言 字符 查找,C 语言实例 - 查找字符在字符串中出现的次数

    C 语言实例 - 查找字符在字符串中出现的次数 C 语言实例 C 语言实例 查找字符在字符串中的起始位置(索引值从 开始). 实例 #include int main() { char str[], ...

  2. java 字符串 字符查找_java之字符串中查找字串的常见方法

    1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引. int indexOf(String str, int startIndex):从指定的索引处开 ...

  3. 面试题之在字符串中查找出第一个只出现一次的字符的位置

    样例:比如"abcdabc",第一个只出现一次的字符为d,位置为3 解决方案1:O(n*n)的复杂度 遍历字符串中的每个字符,然后用该字符在字符串中进行查找,如果没有找到和当前字符 ...

  4. python找到字符中空格所在的位置_Python 查找字符在字符串中的位置示例效果

    Python 查找字符在字符串中的位置实例 下面为大家分享一篇Python 查找字符在字符串中的位置实例,具有很好的参考价值,希望对大家有所帮助.一起过来看看吧 str_1='wo shi yi zh ...

  5. 查找一个字符串中的所有子串的位置

    /***查找一个字符串中的所有子串的位置* * */function searchSubStr(str: any, subStr: any, positions: any): void {let po ...

  6. 在字符串中查找指定字符

    10-1. 在字符串中查找指定字符(15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 白洪欢(浙江大学) 输入一个字符串S,再输 ...

  7. 本题要求编写程序,从给定字符串中查找某指定的字符。

    本题要求编写程序,从给定字符串中查找某指定的字符. 输入格式: 输入的第一行是一个待查找的字符.第二行是一个以回车结束的非空字符串(不超过80个字符). 输出格式: 如果找到,在一行内按照格式&quo ...

  8. python查找指定字符位置_Python 查找字符在字符串中的位置实例

    下面为大家分享一篇Python 查找字符在字符串中的位置实例,具有很好的参考价值,希望对大家有所帮助.一起过来看看吧 str_1='wo shi yi zhi da da niu ' char_1=' ...

  9. 查找字符串中指定字符的位置c语言,C语言中查找字符在字符串中出现的位置的方法...

    C语言strchr()函数:查找某字符在字符串中首次出现的位置 头文件:#include strchr() 用来查找某字符在字符串中首次出现的位置,其原型为: char * strchr (const ...

最新文章

  1. 服务化部署框架Paddle Serving
  2. gedit emacs
  3. Linux 查看 80 端口的占用情况
  4. 【技术综述】一文道尽R-CNN系列目标检测
  5. 设置ALV单元格可编辑状态
  6. Log4net 在framework Client中编译失败
  7. JSP 基础之 JSTL c:forEach用法
  8. 开源项目商业模式分析(2) - 持续维护的重要性 - Selenium和WatiN
  9. Putty打开.pem加密的服务器
  10. Atitit 眼科医学之道 attilax总结
  11. js去掉字符串第一位和最后一位
  12. Stata新命令:psestimate - 倾向得分匹配中协变量的筛选
  13. {大学快毕业的程序员,现在开始写博客}
  14. IDEA2020版本Bpmn文件无Editor属性设置编辑器问题的解决
  15. 任意文件下载(读取)
  16. 简单快速!分享给你一款在线jpg格式转换器
  17. 机械键盘上的ASF是什么意思?
  18. 又一所新大学将落户广东省!
  19. 计算机毕业设计ssm宠物领养平台2x520系统+程序+源码+lw+远程部署
  20. 码教授送你的毕业季礼物

热门文章

  1. man hdparm
  2. Scala 知识点掌握1
  3. 2018-12-08 acm日常 HDU - 6292(模拟找最小)
  4. css上传图片中等待不可点击效果
  5. 组合数据类型练习,综合练习
  6. jQuery--noConflict()方法
  7. linux系统添加环境变量
  8. Oracle 数据库和监听器开机自启动两种实现方法
  9. Python学习日记(3)Python内建函数map()、filter()和匿名函数表达式
  10. 抹掉Scala的糖衣(14) -- Update Method