问题在代码注释的那一行
编程目的
1.掌握字符串的顺序存储表示方法;
2.掌握字符串模式匹配算法BF算法或KMP算法的实现。
3.提升编程能力。
题目:基于字符串模式匹配算法的病毒感染检测问题
问题描述
医学研究者最近发现了某些新病毒,通过对这些病毒的分析,得知它们的DNA序列都是环状的。现在研究者已收集了大量的病毒DNA和人的DNA数据,想快速检测出这些人是否感染了相应的病毒。为了方便研究,研究者将人的DNA和病毒DNA均表示成由一-些字母组成的字符串序列,然后检测某种病毒DNA序列是否在患者的DNA序列中出现过,如果出现过,则此人感染了该病毒,否则没有感染。例如,假设病毒的DNA序列为baa,患者1的DNA序列为abbb则感染;患者2的DNA序列为bba,则未感染。注意,人的DNA序列是线性的,而病毒的DNA序列是环状的。
输人要求
多组数据,每组数据有1行,为序列A和B, A对应病毒的DNA序列,B对应人的DNA序。
列。A和B都为“0”时输人结束。
输出要求
对于每组数据输出1行,若患者感染了病毒输出“YES", 否则输出“NO"。
输人样例
Abbab abbabaab
baa cacdvcabacsd
abc def
00
输出样例
YES
YES
NO
编程提示
(1)利用BF算法来实现字符事的模式匹配过程效率较低,可以利用KMP算法完成模式四配以提高算法的效率。
(2)贴出源程序代码,并给出程序测试结果的截屏。
(3)根据测试结果给分。每个输出样例正确5分,合计15分。
#include<bits/stdc++.h>
using namespace std;
string A,B;
const int MAXSIZE=100;
int nextval[MAXSIZE];
int cnt[MAXSIZE];
void get_nextval(){
int i=0,j=-1;
nextval[0]=-1;
while(i<A.size()){
if(j==-1||A[i]==A[j]){
++i;
++j;
if(A[i]!=A[j])nextval[i]=j;
else nextval[i]=nextval[j];
}else{
j=nextval[j];
}
}
}
int index(){
int i, j, lenB, lenA;
lenB = B.size();
lenA = A.size();
for(int k=0;k<A.size();k++){
i=0;
j=0;
get_nextval();
while(i< B.size() && j< lenA){//lenA换成A.size()运行结果就不正确了,不知道为啥???
if(j==-1 || B[i]==A[j]){
i++;
j++;
}else{
j=nextval[j];
}
}
if(j == A.size()){
return 0;
}
else{
char temp=A[0];
int n;
for(n=0;n<A.size()-1;n++){
A[n]=A[n+1];
}
A[n]=temp;
}
}return -1;
}
int main(){
int m=0;
while(true){
cin>>A>>B;
if(!A.compare("0")&&!B.compare("0"))
break;
for(int i=0;i<=A.size();i++){
A[i]=tolower(A[i]);
}
for(int i=0;i<=B.size();i++){
B[i]=tolower(B[i]);
}
cnt[m]=index();
m++;
}
for(int i=0;i<m;i++){
if(cnt[i]==-1)cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
return 0;
}