1.编写及实现顺序串的的定义及基本操作函数。
2.利用顺序串实现串的各种模式匹配算法。研究者将人的DNA和病毒DNA均表示成由一些字母组成的字符串序列。然后检测某种病毒DNA序列是否在患者的DNA序列中出现过,如果出现过,则此人感染了该病毒,否则没有感染。例如,假设病毒的DNA序列为t=“baa”,患者1的DNA序列为s1=“aaabbaaba”,则感染,患者2的DNA序列为s2=“”babbbabcabb,则未感染。请你编写实现病毒感染检测。
具体实现代码如下:
1.代码:
#include <iostream>
using namespace std;
#define MaxSize 100
typedef char ElemType;
typedef struct
{
char data[MaxSize];
int length;
}SqString;
void StrAssign(SqString &s,char cstr[])//生成串
{
int i;
for(i=0;cstr[i]!='\0';i++)
{
s.data[i]=cstr[i];
}
s.length=i;
}
void DestroyStr(SqString &s)//销毁串
{}
void StrCopy(SqString &s,SqString t)//串的复制
{
int i;
for(i=0;i<t.length;i++)
s.data[i]=t.data[i];
s.length=t.length;
}
bool StrEqual(SqString s,SqString t)//判断串相等
{
bool same=true;
int i;
if(s.length!=t.length)
same=false;
else
for(i=0;i<s.length;i++)
if(s.data[i]!=t.data[i])
{
same=false;
break;
}
return same;
}
int StrLength(SqString s)//求串长
{
return s.length;
}
SqString Concat(SqString s,SqString t)//串的连接
{
SqString str;
int i;
str.length=s.length+t.length;
for(i=0;i<s.length;i++)
str.data[i]=s.data[i];
for(i=0;i<t.length;i++)
str.data[s.length+i]=t.data[i];
return str;
}
SqString SubStr(SqString s,int i,int j)//求字串
{
int k;
SqString str;
str.length=0;
if(i<=0||i>s.length||j<0||i+j-1>s.length)
return str;
for(k=i-1;k<i+j-1;k++)
str.data[k-i+1]=s.data[k];
str.length=j;
return str;
}
SqString InsStr(SqString s1,int i,SqString s2)//字串的插入
{
int j;
SqString str;
str.length=0;
if(i<=0||i>s1.length+1)
return str;
for(j=0;j<i-1;j++)
str.data[j]=s1.data[j];
for(j=0;j<s2.length;j++)
str.data[i+j-1]=s2.data[j];
for(j=i-1;j<s1.length;j++)
str.data[s2.length+j]=s1.data[j];
str.length=s1.length+s2.length;
return str;
}
SqString DelStr(SqString s,int i,int j)//删除字串
{
int k;
SqString str;
str.length=0;
if(i<=0||i>s.length||i+j>s.length+1)
return str;
for(k=0;k<i-1;k++)
str.data[k]=s.data[k];
for(k=i+j-1;k<s.length;k++)
str.data[k-j]=s.data[k];
str.length=s.length-j;
return str;
}
SqString RepStr(SqString s,int i,int j,SqString t)//字串的替换
{
int k;
SqString str;
str.length=0;
if(i<=0||i>s.length||i+j>s.length+1)
return str;
for(k=0;k<i-1;k++)
str.data[k]=s.data[k];
for(k=0;k<t.length;k++)
str.data[i+k-1]=t.data[k];
for(k=i+j-1;k<s.length;k++)
str.data[t.length+k-j]=s.data[k];
str.length=s.length-j+t.length;
return str;
}
void DispStr(SqString s)//输出串
{
int i;
if(s.length>0)
{
for(i=0;i<s.length;i++)
printf("%c",s.data[i]);
printf("\n");
}
}
int main()
{
SqString s,s1,s2,s3,s4;
char c[]="abcdefghefghijklmn";
char c1[]="xyz";
StrAssign(s,c);
StrAssign(s1,c1);
printf("串s为:");
DispStr(s);
printf("串s的长度为:%d\n",StrLength(s));
s2=InsStr(s,9,s1);
printf("插入字符后的串s2为:");
DispStr(s2);
s2=DelStr(s,2,5);
printf("删除字符后的串s2为:");
DispStr(s2);
s2=RepStr(s,2,5,s1);
printf("替换字符后的串s2为:");
DispStr(s2);
s3=SubStr(s,2,10);
printf("提取字符后的串s3为:");
DispStr(s3);
s4=Concat(s1,s2);
printf("连接串s1和s2后的串s4为:");
DispStr(s4);
return 0;
}
2.代码:
BF:
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int BF(const string &str1, const string &str2, int p)
{
int i = p;
int j = 0;
int len1 = str1.size();
int len2 = str2.size();
while (i<len1&&j<len2)
{
if (str1[i] == str2[j])
{
i++;
j++;
}
else
{
i = i - j + 1;
j = 0;
}
}
if (j >= len2)
return i - len2;
else
return -1;
}
int main()
{
int p = 0;
string str1;
string str2;
printf("请分别输入病毒序列和检测序列,输入0结束\n");
while (cin >> str2 >> str1)
{
if (str1 == "0"&&str2 == "0")break;
int result = BF(str1, str2, p);
if (result != -1)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}
KMP:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
#include <string.h>
#define MAXSTRLEN 100
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef unsigned char SString[MAXSTRLEN + 1];
Status StrAssign(SString &T, char *chars) {
if(strlen(chars) > MAXSTRLEN)
return ERROR;
else {
T[0] = strlen(chars);
for(int i=1; i<=T[0]; i++)
T[i] = *(chars+i-1);
return OK;
}
}
int StrLength(SString S) {
return S[0];
}
void get_nextval(SString T,int nextval[])
{
int j;
int i=1;nextval[1]=0;j=0;
while(i<T[0])
{
if(j==0||T[i]==T[j])
{i++;j++;
if(T[i]!=T[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else j=nextval[j];
}
}
int Index_KMP_val(SString S,SString T,int p)
{
int nextval[MAXSTRLEN+1];
get_nextval(T,nextval);
int i=p; int j=1;
while(i<=S[0]&&j<=T[0])
{
if(j==0||S[i]==T[j])
{
++i;++j;
}
else j=nextval[j];
}
if(j>T[0]) return i-T[0];
else return 0;
}
int main()
{
int flag[100];
int w=0;
int x;int number;int p;
char c[MAXSTRLEN+1],d[MAXSTRLEN+1];
SString S;
SString T;
SString Z;
printf("请分别输入病毒序列和检测序列,输入0结束\n");
do
{
scanf("%s",d);
scanf("%s",c);
StrAssign(S, c);
StrAssign(T, d);
char str[T[0]];
for(int i=0; i<=S[0]; i++)
str[i] = T[i+1];
int i=0;
Z[0]=T[0];
for(i=0;i<T[0];i++)
{
for(int j=1;j<=T[0];j++)
{
Z[j]=str[(j+i)%(T[0])];
}
number=Index_KMP_val(S,Z,p);
if(number!=0&&strcmp(c,"0")!=0&&strcmp(d,"0")!=0)
{
flag[w++]=1;
break;
}
}
if(i==T[0]&&strcmp(c,"0")!=0&&strcmp(d,"0")!=0)
flag[w++]=0;
}while(strcmp(c,"0")!=0&&strcmp(d,"0")!=0);
for(int e=0;e<w;e++)
{
if(flag[e]==1)
printf("YES\n");//即在人体dna中找到与病毒dna相同的序列
else
printf("NO\n");//即在人体dna中找到与病毒dna相同的序列
}
return 0;
}
请大家多多指教