数据结构—KMP模式匹配病毒感染人的DNA检测

原理:参考趣学数据结构

代码:

#include<stdio.h>
#include<stdlib.h>
#define N 100
int next[N];
void getNext(char *T, int *next, int m) {//求解当前字符前面的最大公共前缀和后缀int j = 1, k = 0;next[j] = 0;//从1开始计算while (j <= m) {if (k == 0 || T[k] == T[j]) {//从下标0开始计算++j;++k;if (T[k] == T[j]) {//改进的更新next数组的方法,减少不必要的回退next[j] = next[k];//没比较的可能}else {//也就是只有不相等的时候才有比较的可能next[j]=k;//与当前k位置的字符比较}}else {k = next[k];//回退查找前面的最大公共前缀和后缀}}printf("next数组值:");for (int i = 1; i <= m; i++) {printf("%d ", next[i]);}printf("\n");
}
int KMP(char * S, char* T, int pos, int n, int m) {//KMP算法进行模式匹配int i = pos, j = 1;while (i <= n&& j <= m) {//不能在这里使用i<=n-m+1,否则可能会破坏(截断)匹配成功if (i > n - m + 1 && j == 1) {break;//再减少一点比较的次数}if (j == 0 || S[i] == T[j]) {i++;j++;}else {j = next[j];//根据最大公共前缀和后缀计算的next数组,j回退而i不回退}}//printf("\n---  %d ---\n", j);if (j ==m+1) {//返回查找成功子串的初始位置 ==不能写成=   写>更安全printf("查找成功子串的初始位置为:%d\n", i - j);return i - j;}printf("查找子串失败!\n");return -1;
}
void haveAffectionV(char *S,char* T,int n,int m) {//检查人的DNA是否被病毒的变种感染char TT[10];//存储病毒的变种 m个变种,不采用二倍线性扩展变种,使用循环取余变种for (int i = 0; i <= m-1; i++) {//移动的步数for (int j = 1; j <= m; j++) {if (i + j <= m) {TT[j] = T[i + j];}else {//对循环重新开始的数取%(m+1)再加1对应下标的字符TT[j] = T[(i + j) % (m + 1)+1];}}for (int k = 1; k <= n; k++) {//遍历主串printf("%c", S[k]);}printf("\n");for (int k = 1; k <= m; k++) {//遍历子串printf("%c", TT[k]);}printf("\n");getNext(TT, next, m);//计算next数组(最大公共前缀和后缀长度)printf("\n");KMP(S, TT, 1, n, m);//模式匹配printf("\n");}
}
int main() {char S[18] = "-adecadecadcbadcb";char T[10] = "-adecadcb";//'\0'字符串结束的标识haveAffectionV(S, T, 16, 8);system("pause");return 0;
}

测试截图:


彩蛋:留一个问题:为什么kmp函数的while条件里面不能写i<=n-m+1来降低几次比较???

时间复杂度O(m x (m+n)),空间复杂度O(m)

如果存在什么问题!欢迎批评指正!谢谢!

数据结构---KMP模式匹配病毒感染人的DNA检测相关推荐

  1. 数据结构 串 KMP 模式匹配详解 通俗易懂

    KMP 模式匹配详解通俗易懂 KMP 模式匹配是解决字符串匹配的问题 一.原始的字符串暴力匹配 要点:子串的第一个字符匹配成功主串的字符后就依次匹配子串后面的字符,直到子串匹配结束 代码: publi ...

  2. c语言数据结构字符串匹配,C语言数据结构之模式匹配字符串定位问题

    字符是计算机的单位,字符的值都取决于字符集,匹配字符串需要找有全新的算法,才能提高程序员的工作效率,今天爱站技术频道就为大家带来了C语言数据结构之模式匹配字符串定位问题,大家参考下文学习吧! C语言数 ...

  3. mNGS及古细菌DNA检测应用推荐:PCR去污染试剂盒

    描述 在研究和诊断中,PCR是一种检测DNA是否存在的敏感方法.PCR中使用的聚合酶经常被E.coli DNA污染.当检测少量细菌DNA时,污染的DNA可能导致灵敏度降低和假阳性.其他污染源可能是dN ...

  4. 数据结构--KMP算法总结

    数据结构-KMP KMP算法用于解决两个字符串匹配的问题,但更多的时候用到的是next数组的含义,用到next数组的时候,大多是题目跟前后缀有关的 . 首先介绍KMP算法:(假定next数组已经学会, ...

  5. CVPR 2020 | 旷视提出新型人-物交互检测框架,实现当前最佳

    本文转载自旷视研究院 本文提出一种新型人-物交互检测算法,可直接把人-物交互关系检测为一系列的交互点,进一步预测朝向人和物体中心的交互向量:接着,这些交互点可以配对组合人与物体的检测结果,以生成最终的 ...

  6. 需求DNA检测:如何判断一个功能是否值得做

    面对来自客服.运营.竞品.市场.用户调研等各个渠道的海量需求,哪些应该放到产品会议中PK.哪些应该直接pass,产品经理该如何抉择?完成"需求采集"后,在召开产品会议进行" ...

  7. 数据结构字符串模式匹配中计算next和nextval的值(C语言)

    在KMP模式匹配中通过next的值可以快速达到匹配目的,那next的值怎么计算呢? 其实计算next的值本身也就是对模式串进行模式匹配,我们一起看看计算next的值的过程: 当模式串 P=" ...

  8. 荧光法双链DNA检测工具—Pico488 dsDNA 定量试剂盒

    今天给大家带来一款荧光法双链DNA检测工具-Pico488 dsDNA 定量试剂盒,Pico488是一种J为灵敏的荧光核酸染料,常用于双链DNA的定量检测.历来DNA浓度的测定在cDNA文库的构建,D ...

  9. 【数据结构】7-4 病毒感染检测 (15 分)

    输入样例1 1 baa bbaabbba 输出样例1 YES 输入样例2 2 cced cdccdcce bcd aabccdxdxbxa 输出样例2 YES NO 函数①:BF算法 函数②:移动改变 ...

最新文章

  1. 系列文章--AJAX技术系列总结
  2. Netflix是这样炼成的:谁构建,谁运维
  3. angularjs 学期下拉列表指令
  4. python 线程指南
  5. mysqlsla的使用
  6. Linux Bash终端支持中文显示
  7. 3 linux禁用ssl_ESXI申请阿里云SSL证书并配置
  8. 用反卷积(Deconvnet)可视化理解卷积神经网络还有使用tensorboard
  9. 用java代码实现九九乘法表
  10. Spring Security 之多AuthenticationProvider认证模式实现
  11. MFC(6)点击按钮弹出新的对话框源码
  12. WS2811B驱动使用及使用说明
  13. sudo 授权需谨慎,否则亲人两行泪!6 个超实用使用技巧
  14. Kiwi Syslog日志服务器的安装及配置使用
  15. 关于网站版权声明(Copyright)的格式和写法
  16. 华为笔试c语言,华为笔试算法题汇总
  17. Vim统计中文字数和英文单词数(附针对LaTeX的特殊处理)
  18. AI:2020年6月24日北京智源大会演讲分享之知识智能专题论坛——11:30-12:00唐杰 教授《CogDL:An Extensive Research Toolkit for Deep Le》
  19. 每日一题——孪生素数对(教你如何高效判断素数,判断素数的全部方法)
  20. java计时器_Java实现的计时器【秒表】功能示例

热门文章

  1. ubuntu之Unable to lock the administration directory(/var/lib/dpkg/), are you root?13 Permission denie
  2. 链表之删除链表a/b处的节点
  3. mysql 配置多个数据库连接_总结MySQL修改最大连接数的两个方式
  4. 连接数学和美学的--西奥多罗斯螺旋
  5. 豆瓣评分9.4!这一部纪录片,探秘中国人迹罕至的未至之境!
  6. 为什么当代人越来越不快乐?
  7. 最诡异数学悖论:1+1=1
  8. 有些图,只要看错一眼就再也回不去了!
  9. 计算机管理无法连接虚拟磁盘服务,虚拟磁盘服务错误怎么操作【图文教程】
  10. U盘安装Linux挂载cd,U盘安装Ubuntu Server CD-ROM挂载失败