实验三 基于字符串模式匹配算法的病毒
感染检测问题
一、实验目的
1
、掌握字符串的顺序存储表示方法。
2
、掌握字符串模式匹配算法
BF
算法或
KMP
算法的实现。
二、实验内容
问题描述
医学研究者最近发现了某些新病毒,通过对这些病毒的分析,得知它们的
DNA
序列都是环状的。现在研究者已收集了大量的病毒
DNA
和人的
DNA
数据,
想快速检测出这些人是否感染了相应的病毒。为了方便研究,研究者将人的
DNA
和病毒
DNA
均表示成由一些字母组成的字符串序列,然后检测某种病毒
DNA
序列是否在患者的
DNA
序列中出现过,如果出现过,则此人感染了该病毒,否
则没有感染。例如,假设病毒的
DNA
序列为
baa
,患者
1
的
DNA
序列为
aaabbba
则感染
;
患者
2
的
DNA
序列为
babbba
,则未感染。
注意,人的
DNA
序列是线性的,而病毒的
DNA
序列是环状的。
输入要求
多组数据,每组数据有
1
行,为序列
A
和
B
,
A
对应病毒的
DNA
序列,
B
对应人的
DNA
序列。
A
和
B
都为
“0”
时输入结束。
输出要求
对于每组数据输出
1
行,若患者感染了病毒输出
“YES”
,否则输出
“NO”
。输
入样例
abbab abbabaab
baa cacdveabacsd
abe def
0 0
#include <iostream>
using namespace std;
#define MAXSIZE 255
//BF算法
int Index_BF(char S[], char T[], int pos)//从第0位开始
{//返回模式T在主串S中第pos个字符开始第一次出现的位置;若不存在,则返回0
int i = pos; int j = 0;
int lenS = strlen(S);
int lenT = strlen(T);
while (i < lenS && j < lenT)
{
if (S[i] == T[j])
{
i++; j++;
}
else
{
i = i - j + 1; j = 0;
}
}
if (j >= lenT)
return i - lenT;
else
return -1;
}
int main()
{
int pos = 0; int result = 0;
char s[MAXSIZE] = {}, t[MAXSIZE] = {};
char output[MAXSIZE] = {};
while (true)
{
cin >> s; cin >> t;
if (s[0] == '0' && t[0] == '0')
{
cout << output << endl;
break;
}
result = Index_BF(t, s, pos);
if (result == -1)
{
strcat_s(output, "No\n");//字符串拼接
}
else
{
strcat_s(output, "Yes\n");//字符串拼接
}
}
}