字符串的查找替换

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;
}

请大家多多指教

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值