问题描述
人的DNA和病毒的DNA均表示成由一些字母组成的字符串序列。
检测某种病毒的DNA序列是否在患者的DNA序列中出现过,如果出现过,则此人感染了该病毒,否则没有感染。
例如,假设病毒的DNA序列为baa,患者1的DNA序列为aaabbba,则患者1感染;患者2的DNA序列为babbba,则患者2未感染。
注意:人的DNA序列是线性的,而病毒的DNA序列是环状的。
算法要求:用BF或KMP模式匹配算法实现。
输入描述
第一行输入一个正整数n,表示进行检测的字符串数量;接着输入n行字符串。
输出描述
输出n行,若感染了,则输出”YES”;若没有感染,则输出”NO”。
样例输入
输入样例1: 1 baa bbaabbba 输入样例2: 2 cced cdccdcce bcd aabccdxdxbxa
样例输出
输出样例1: YES 输出样例2: YES NO
#include<stdio.h>
#define MAXLEN 100
typedef struct
{
char ch[MAXLEN];
int length;
}SString;
void StrAssign(SString&S, char str[]) //初始化
{
int i = 0;
while (str[i] != '\0')
{
S.ch[i] = str[i];
i++;
}
S.length = i;
return;
}
void Operate(SString HumanS, SString VirS)
{
for (int k = 1; k <= VirS.length; k++)
{
int i = 0;
int j = k - 1;
int n = 0;
while (i < HumanS.length && j < VirS.length)
{
if (HumanS.ch[i] == VirS.ch[j])
{
i++;
j = (j + 1) % VirS.length;
n++;
}
else
{
i = i - n + 1;
j = (k - 1) % VirS.length;
n = 0;
}
if (n == VirS.length)
{
printf("YES\n");
return;
}
}
}
printf("NO\n");
return;
}
int main()
{
int n = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
SString HumanS;
SString VirS;
char virstr[MAXLEN] = { 0 };
char humanstr[MAXLEN] = { 0 };
scanf("%s%s", virstr, humanstr);
StrAssign(HumanS, humanstr);
StrAssign(VirS, virstr);
Operate(HumanS, VirS);
}
return 0;
}