首先我们需要在保存代码的文件夹下新建议个文本文件(这里文件名为: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;
}
执行后结果文件里保存的结果为: