基于BF算法实现病毒检测,使用顺序存储方式实现对是否感染进行储存。
#include < stdio.h >
#include < stdlib.h >
#include < string.h >
#define MAX_SIZE 100000
#define RESULTNUMBER 10 // 定义结果数组的大小
typedef struct{
char ch[MAX_SIZE + 1];
int length;
} SString;
//BF匹配算法
int Index_BF(SString S, SString T, int pos)
{
//返回模式T在主串s中第pos个字符开始第一次出现的位置.若不存在,则返回值为0
int i, j;
i = pos; j = 0; //初始化
while (i < S.length && j < T.length) //两个串均未比较到串尾
{
if (S.ch[i] == T.ch[j]) { i++; j++; } //继续比较后继字符
else { i = i - j + 1; j = 0; } //指针后退重新开始匹配
}
if (j >= T.length) return 1;//匹配成功
else return 0; //匹配失败
}
//将病毒复制,解决环状问题
bool VirusCopy(SString S[], SString T[]) {
//利用 BF 算法实现病毒检测
SString Person, Virus, temp;
int m, flag;
Person = S[0];
Virus = T[0];
flag = 0; //用来标识是否匹配,初始为0,匹配成功不是0
m = Virus.length; //病毒 DNA 序列的长度是 m
//由于病毒DNA为环状结构,所以将病毒字符串复制一次
for (int i = m, j = 0; j < m; j++) {
Virus.ch[i++] = Virus.ch[j];
}
Virus.ch[2 * m] = '\0'; //添加结束符号
for (int i = 0; i < m; i++) //依次取得每个长度为m 的病毒 DNA 环状字符串 temp
{
for (int j = 0; j < m; j++)
{
temp.ch[j] = Virus.ch[i + j];
temp.ch[m] = '\0'; //添加结束符号
temp.length = m;
}
flag = Index_BF(Person, temp, 0); //模式匹配
if (flag) break; //匹配即可退出循环
}
return flag;
}
int main() {
SString T, S;
bool results[RESULTNUMBER] = {}; // 结果数组
int resultCount = 0; // 当前结果数量
printf("请输入数据(输入0 0结束数据输入):\n");
while (scanf("%s %s", S.ch, T.ch) != EOF) {
if (strcmp(S.ch, "0") == 0 && strcmp(T.ch, "0") == 0)
break;
S.length = strlen(S.ch);
T.length = strlen(T.ch);
if (S.length > MAX_SIZE || T.length > MAX_SIZE) {
printf("所输入字符串超过最大长度限制\n");
continue;
}
// 进行病毒检测操作
bool result = VirusCopy(& S, & T);
results[resultCount] = result; // 存储结果到数组中
resultCount++; // 更新结果数量
}
// 打印结果
for (int i = 0; i < resultCount; i++) {
printf("第%d组数据的匹配结果是: %s\n", i + 1, results[i] ? "YES" : "NO");
}
return 0;
}
重点:
如何解决病毒为环状DNA问题?
将病毒序列复制两次,每次对比取出与原病毒序列相同长度的字符串,进行BF算法暴力匹配