以文件读取和写入的方式实现病毒和人DNA的匹配(采用KMP算法)

16 篇文章 0 订阅

首先我们需要在保存代码的文件夹下新建议个文本文件(这里文件名为:1)用来保存需要检测的数据,格式为:在这里插入图片描述
然后再建一个名为2的文本文件用来保存结果。

1,注意把这些文件和代码的.CPP文件保存在一个文件夹下的目的是为了对文件进行操作时不需要添加文件的路径以减少出错的概率

2,根据实际情况中病毒的DAN是环状的而我们保存病毒DNA的字符串却是线性的额,因此病毒DNA的起始位置是不确定的。在这里我们可以运用一个小技巧:把病毒的DNA连续在字符串中连续保存两次然后再依次取原来长度的字串即可

话不多说直接上代码:

#include <iostream>
#include <fstream>
#include <sstream>
#include <cstring>
using namespace std;
int main()
{
	string p1,s;
	
	fstream f;
	f.open("1.txt",ios::in);

	while(f>>p1>>s)
	{
		int sum1=p1.size();//记录病毒DNA的长度; 
		int sum2=s.size();
		s=" "+s;
		string p=p1;
		p+=p1;
	//	cout<<p<<endl;
	    int flage1=1;
	  for(int i=0;i<sum1;i++)
	  {
	  	int flage2=0;
	  	string p2;
	  	p2=" "+p.substr(i,sum1);
	  	
	  //	cout<<p2<<endl;
	  	
	  	//KMP求next数组的过程 
	  	    int ne[1010];
	  	    memset(ne,0,sizeof ne);
		  	for(int i=2,j=0;i<=sum1;i++)
		  	{
		  		while(j&&p2[i]!=p2[j+1]) j=ne[j];
		  		if(p2[i]==p2[j+1]) j++;
		  		ne[i]=j;
			}
		
		   // cout<<s<<endl; 
		  //字符串匹配的过程 
			for(int i=1,j=0;i<=sum2;i++)
			{
				while(j&&s[i]!=p2[j+1]) j=ne[j];
				if(s[i]==p2[j+1]) j++;
				if(j==sum1)
				{
				//	cout<<"YES"<<endl;
					flage2=1;
					
					ofstream file;
	         	    file.open("./2.txt", ios_base::app);

					if (!file.is_open())
					{
						cout<<"打开文件失败";
					}
				
					string ss;
					ss=p1+"    "+s+"   "+"YES";
					file<<ss<<endl;
				    file.close();
					
					break;
				
				}
			}
			if(flage2) 
			{
			  flage1=0;
			  break;
			}
	  }
		  if(flage1)
		  {
		  //	cout<<"NO"<<endl;
		  	ofstream file;
	         	    file.open("./2.txt", ios_base::app);

					if (!file.is_open())
					{
						cout<<"打开文件失败";
					}
				
					string ss;
					ss=p1+"    "+s+"   "+"NO";
					file<<ss<<endl;
				    file.close();
		  }	
	}
	
	string s1,s2,s3;
	fstream f2;
	f2.open("2.txt",ios::in);
	while(f2>>s1>>s2>>s3)
	{
		cout<<s1<<"   "<<s2<<"   "<<s3<<endl;
	}

	return 0;
} 

执行后结果文件里保存的结果为:在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值