碱基序列匹配(ACM真题)

地理项目是IBM和国家地理学会的合作研究项目,从成千上万捐献的DNA分析地球上人类是如何繁衍的。作为一个IBM的研究人员,请你写一个程序找出给定的DNA片段之间的相同之处,使得对个体的调查相关联。一个DNA碱基序列是指把在分子中发现的氮基的序列给罗列出来。有四种氮基:腺嘌呤 (A)、胸腺嘧啶(T)、鸟嘌呤(G)和胞嘧啶(D),例如,一个6碱基DNA序列可以表示为 TAGACC。给出一个DNA碱基序列的集合,确定在所有序列中都出现的最长的碱基序列。

输入格式:
输入的第一行给出了整数n,表示测试数据集合的数目。每个测试数据集合由下述两部分组成:一个正整数m(2≤m≤10),给出数据集合中碱基序列的数目。m行,每行给出一个60碱基的碱基序列。

输出格式:
对于输入的每个测试数据集合的所有的碱基序列,输出最长的相同的碱基子序列。如果最长的相同的碱基子序列的长度小于3,则输出“no significant commonalities”来代替碱基子序列。如果相同最长长度的子序列有多个,则仅输出按字母排序的第一个。

输入样例

3
2
GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
3
GATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATACCAGATA
GATACTAGATACTAGATACTAGATACTAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA
GATACCAGATACCAGATACCAGATACCAAAGGAAAGGGAAAAGGGGAAAAAGGGGGAAAA
3
CATCATCATCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
ACATCATCATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACATCATCATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

输出样例

no significant commonalities
AGATAC
CATCATCAT

思路:KMP算法遍历每一个子串
KMP基本思想:发生不匹配时,主串S的i不回溯,子串T的j回溯到next[j]对应位置的k上。
①用字符串数组存储每一组的碱基序列,数组的元素是一串碱基序列;
②从第一串碱基序列(字符串数组的第一个元素)入手,从最长的子串(碱基序列本身)开始与其他序列进行比对,直到找到共有的子串为止;
③暴力列举每一个子串进行比对,采用KMP算法进行比较。

代码如下:

#include<bits/stdc++.h>
using namespace std;void getNext(string S,int* next)  //得到子串下面的数组
{int j,k;j=0;k=-1;next[0]=-1;  //子串0号元素下面数为-1while(j<(S.size()-1))  //对子串所有元素下面赋值{if(k==-1||S[j]==S[k])  //如果k回到了第一个元素或者第j个元素等于第k个元素{j++;k++;  //j++;k++;next[j]=k;  //子串第j个元素下面的数为k}elsek=next[k];  //k为第子串第k个元素下面的数}
}bool Compare(string T,string *S,int n)  //返回该子串是否是每一个序列的子串
{int a=T.size();  //得到子串T的长度int next[a];  //建立子串的数组下标getNext(T,next);  //给子串数组赋值int results[n];  //建立一个大小为n的数组判断子串是不是n-1个主串的公共子串for(int i=0;i<n;i++){results[i]=0;  //给数组hhh全赋初值0}for(int l=1;l<n;l++){int aa=S[l].size();  //得到主串的长度int i=0,j=0;while(i<aa)  //当主串下标没到达尾部时{if(j==-1||S[l][i]==T[j]){++i;++j;}elsej=next[j];if(j==a){results[l]=1;break;}}}for(int i=1;i<n;i++)  //查看该子串是否为每一个主串下面的子串{if(results[i]!=1)return false;  //不是则返回false}return true;  //反之是则返回true
}void Deal(string *aar,int n)
{string key="Z";  //假定最长公共序列keystring try1;  //第一个碱基序列的每一个字串int w=0;for(int i=60;i>=3;i--)  //从最长字符串长度开始作为子串长度{if(w!=0&&i<w){cout<<key<<endl;return ;}for(int k=0;k<=60-i;k++)  //开始位置{try1=aar[0].substr(k,i);  //第一个碱基序列的一个字串//cout<<try1<<endl;if(Compare(try1,aar,n))  //查看是否为公共字串{w=i;if((try1.size()>=key.size())&&(try1<key))key=try1;}}}if(key.size()<3)cout<<"no significant commonalities"<<endl;elsecout<<key<<endl;
}int main()
{int N;cin>>N; //输入数据集合的数目Nfor(int z=0;z<N;z++)  //输入集合的每一组元素{int n;cin>>n;  //输入数据集合中碱基序列的数目nstring jjsz[n];  //建立jjsz[n]数组存放每一组碱基序列for(int x=0;x<n;x++){cin>>jjsz[x];  //存放每一个碱基序列}Deal(jjsz,n);  //开始处理}return 0;
}

KMP算法的应用——碱基序列匹配相关推荐

  1. 【gif图文】KMP算法(从暴力匹配到快速匹配)

    从暴力匹配到快速匹配(KMP算法) 学习kmp算法前,首先要先了解什么是kmp算法,kmp算法具体优点是什么,kmp的主要应用方向在哪. 然后才是,代码实现 带着以上问题,我们来一步一步学习kmp算法 ...

  2. Java数字匹配的kmp算法

    package Four; /**** 研究kmp算法(数字之间的匹配模式)* @author bai* 题目描述:给你两个数字序列,你的任务是在序列a中* 找到和序列b完全匹配的子串,如果有多个匹配 ...

  3. 三十五、字符串匹配问题--KMP算法

    一.暴力匹配算法实现字符串匹配 如果用暴力匹配的思路,并假设现在 str1 匹配到 i 位置,子串 str2 匹配到 j 位置,则有: 如果当前字符匹配成功(即 str1[i] == str2[j]) ...

  4. c语言主范式与编码,超详细!终于搞明白KMP算法

    小伙伴们好久不见,今天将开设"数据结构与算法"专栏,一起梳理一遍硬核课程的重要知识点,那我们开始吧 正文 「字符串匹配」是计算机的基本任务之一,举个栗子,有一个字符串"「 ...

  5. 数据结构:详解KMP算法,手工求解next、nextval数组,求模式串的比较次数例题

    KMP 算法 手工求解 next 数组,nextval数组 例题:求模式串的比较次数 2019 年 408 统考真题 设主串 T="abaabaabcabaabc",模式串 S=& ...

  6. [算法系列之二十六]字符串匹配之KMP算法

    一 简介 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的关键是利 ...

  7. 字符串:3.KMP算法(快速模式匹配算法)详解

    BF算法的改进--KMP算法(快速模式匹配算法). 串的普通模式匹配算法,大体思路是:模式串从主串的第一个字符开始匹配,每匹配失败,主串中记录匹配进度的指针 i 都要进行 i-j+1 的回退操作(这个 ...

  8. SCU4438 Censor(审查员) (KMP算法与模拟栈的应用 || HASH表与模拟栈的结合)

    Censor frog is now a editor to censor so-called sensitive words (敏感词). She has a long text pp. Her j ...

  9. 字符串匹配代码C语言,KMP算法(快速模式匹配算法)详解以及C语言实现

    通过上一节的介绍,学习了普通模式匹配算法,大体思路是:模式串从主串的第一个字符开始匹配,每匹配失败,主串中记录匹配进度的指针 i 都要进行 i-j+1 的回退操作(这个过程称为"指针回溯&q ...

  10. 数据结构:KMP算法 串的模式匹配算法(全网最详细)

    目录 KMP模式匹配算法 简述 KMP模式匹配算法原理 如果人眼来优化的话,怎样处理         接下来我们自己来发现j的移动规律: 这一段公式证明了我们为什么可以直接将j移动到k而无须再比较前面 ...

最新文章

  1. [YTU]_2444(C++习题 对象转换)
  2. 一次竞赛案例的分享——基于正则表达式的深度学习应用
  3. 使用 CXF 做 webservice 简单例子
  4. 惠普服务器查询ilo信息,Hp服务器iLO IML硬件日志收集与远程巡检
  5. C语言 int** 二重指针的理解
  6. oracle 12 if,Oracle 12.1 RAC 系列 – 配置第二个网络和相应的SCAN2
  7. 漫画:趣解鸿蒙 OS 如何实现跨平台?
  8. Android 控件 之 Adapter 基础讲解
  9. 真人发音计算机怎么弄成音乐模式,文字转语音真人发声怎么转换?简单教程分享...
  10. limesurvey的问卷类型
  11. PHP站长工具箱网站源码下载,在线小工具网站源码,独立后台管理,可自主添加工具
  12. 1062lcd在dxp哪个库_protel dxp 2004 元件库中的常用元件所在位置
  13. C语言strtok()函数详解
  14. java根据业务排序利用Comparator.comparing自定义排序规则
  15. python 数字转换成汉字,Python实现把数字转换成中文
  16. 5红5绿6蓝穿手链c语言,礼仪习题库(含答案)
  17. 讨论——如何避免在直通车中高展现底点击的现象
  18. Python123 练习7
  19. linux内核编程(一)
  20. 【文献阅读笔记】利用CVX工具箱求解复数问题的方法

热门文章

  1. 如何将eclipse项目和svn关联(从服务器取项目)
  2. WindowManagerService详述
  3. 几个好中的计算机类EI源刊
  4. 虚拟内存怎么设置最好_虚拟内存怎么设置到d盘
  5. altium room 布局_Altium Designer的PCB中ROOM的功用、放置、修改
  6. 征途LINUX服务端脚本技术,腾讯征途手游脚本 辅助基本语法
  7. Linux如何修改只读文件(以设置自动连网为例)
  8. 《西方哲学史》阅读笔记
  9. gds是什么系统简称_气体检测仪GDS系统是什么系统?
  10. 使用U盘在虚拟机中安装系统