大佬们求解

问题在代码注释的那一行

编程目的

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;
}
  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值