模拟基因序列
in.people
ATGCUGACTUGCATUCTUGCUGACCTUGCATUUUGCATUCTUGUGCATUCTUGUGCATUCTUGUGCUGACCTUGCATUGACTUGCATUCTUGCUGACCCATUGACTUGCATUUGACCTUGCATUUUACCCATUGACTUCUGACCCATUGACUGACCCCCATUCTUGCUGACCCATUGACUGCUGACCTUGCATUUCATUCTUGCUGACUGACCTUGCACTUGCATUCTUGACCTUGCATUUACCCATUGACTTUGUGACCCATUGACCCTUGCATUUACCCATUCTUGACCUGACCCATUGACUGATTGCUAUGACTTUGUGACCCATUGACCCTUGCATUUACCCATUCTUGACCUGACCCATUGCACTUACCACCTUGCAACUGACCTUGCACTUACCACCTUGCACCTUGCACATUCTUUCTUGCUGACCCUGACCUGACCCATUGACUGACGCACTUGCATUTUCTUGACCUGACCACCTUGCATUUACCCATUTUGCATUTCTUGCUGACCATUGACUGGCUATACCCCCATUCTUGACCUUGCUGACCCUGCCTUGCATUUACCCATUGACTUGCAUGACUGCUGCCCATUGUGCACTUGCGCUGACCCCTUGCAUGACUGCUGUGAGACTTUGACTUGCUGACCTUGCUGACCTUGCCTUGCACTUTUGACCTUGCUGACUATGATCATCCUU
in.virus
ATGCU
#include<iostream>
#include<fstream>
#define MAX 700
#define RIGHT 1
using namespace std;
//串的声明
typedef struct {
char ch[MAX];
int length;
} str;
int KMP(str s,str t,int pos=1);
void getNext(str s,int next[]);
//KMP匹配函数
int KMP(str s,str t,int pos) {
int next[t.length+1];
getNext(t,next);
int i=pos;
int j=1;
while(i<=s.length && j<=t.length) {
if(j==0 || s.ch[i-1]==t.ch[j-1]) {
i++;
j++;
} else {
j=next[j];
}
}
if(j>t.length) {
return(i-t.length);
} else {
return 0;
}
}
//next数组形成函数
void getNext(str s,int next[]) {
int i=1;
int j=0;
next[i]=j;
while(i<=s.length) {
if(j==0 || s.ch[i-1]==s.ch[j-1]) {
i++;
j++;
next[i]=j;
} else {
j=next[j];
}
}
}
//文件加载函数
void load(string fileName,str &s) {
fstream inFile;
inFile.open(fileName.c_str());
s.length=0;
inFile>>s.ch[s.length];
while(!inFile.eof()) {
s.length++;
inFile>>s.ch[s.length];
}
inFile.close();
}
//查看串
int scanString(str s) {
for(int i=0; i<s.length; i++) {
cout<<s.ch[i];
}
cout<<endl;
cout<<"&序列长度:"<<s.length<<endl;
return RIGHT;
}
int main(void) {
int l,i,flag,j,buf;
str virus,people;
load("in.virus",virus);
load("in.people",people);
cout<<"***模拟的被检测人类基因序列片段***"<<endl;
scanString(people);
cout<<endl;
cout<<"***模拟的被检测病毒序列***"<<endl;
scanString(virus);
cout<<"-----------------------检测结果--------------------------"<<endl;;
l=virus.length;
for(i=0; i<l; i++) { //循环以实现环状基因的轮转
flag=KMP(people,virus);
if(flag) {
cout<<"!!! 检测到环状病毒基因";
for(j=0; j<l; j++) {
cout<<virus.ch[j];
}
cout<<","<<"第一次出现于人体基因序列片段第"<<flag<<"位"<<endl;
}
//对病毒基因串进行变换,使其出现环状的每一种情况
buf=virus.ch[0];
for(j=0; j<l-1; j++) {
virus.ch[j]=virus.ch[j+1];
}
virus.ch[l-1]=buf;
}
return 0;
}
定义了两个串,分别是从文件in.people输入人类基因序列,从in.virus输入病毒基因序列,随后采用KMP算法进行匹配。结果将显示环状基因各种情况下的第一次在人类基因串出现的位置。