11-12实现病毒检测

基于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算法暴力匹配

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啥也不会写呢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值