刚哥遇到了感情问题(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 上一集我们讲到 作为工作室老大的刚哥遇到很多女生的追求,你帮他个挑选了个英语成绩不错的对象。在你

本文介绍了一种基于字符串匹配的算法实现,通过使用BF算法来查找字符串中的子串出现次数及位置,并结合快速排序算法对匹配结果进行排序,最终按特定规则输出匹配字符串。该程序实现了对输入字符串与预设字符串数组的匹配处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# include <stdio.h>
# define N 201
char A[][7]={"apple","banana","orange"};  //A->B
char B[][5]={"miss","love","kiss"};
int S[]={4,5,5},num,D[2][N];
char C[N];
int BF(char a[],char b[],int c[]);//返回b字符串在a中的个数 c存储b在a中的下标 从c[num]开始存储 num为全局变量
void change(int *a,int *b);//交换函数
void Qsort(int A[][N],int left,int right);//快速排序 升序
int main(){
    int i,j,k;
    //freopen("AAA.txt","r",stdin);
    while(gets(C)){
    for(i=j=num=0;i<3;i++)//用 A[i]匹配C 返回匹配的个数
    {
      k=BF(C,A[i],D[0]);//k记录A[i]匹配的个数
    while(k--)D[1][j++]=i;//D[1]用来存储i
    }
    Qsort(D,0,num-1);//以A[0]升序 从下标0---  num-1  一共num个
    for(i=j=0;C[i];i++){//输出
        if(i==D[0][j]&&j<num)
        {
            printf("%s",B[D[1][j]]);
            i+=S[D[1][j++]];
        }
        else printf("%c",C[i]);
    }
    printf("\n");//输出回车符
    }
    return 0;
}
int BF(char a[],char b[],int c[]){//返回b字符串在a中的个数 c存储b在a中的下标 从c[num]开始存储 num为全局变量
    int i=0,j=0,k=num;//k存储当前已经匹配的个数
    do{
        if (b[j]&&a[i++]==b[j])++j;//如果匹配成功 继续向下匹配
        else
        {
            b[j]?(i-=j):(c[num++]=i-j);//b字符串到头了吗?如果到头了即b[j]=0 此时 c存储匹配下标 否则i回溯
            j=0;//无论匹配成功与否  b都要重新和a检测
        }
    }while(a[i-1]);
    return num-k;//返回b在a中匹配的个数
}
void change(int *a,int *b){//交换函数 交换a b的值
   int c=*a;
   *a=*b;
   *b=c;
}
void Qsort(int A[][N],int left,int right)//不需要知道内部 只需要知道是升序就行了
{
    int i=left,j=right,temp=A[0][left];
    if(left>=right)  return;
    while(i!=j)
    {
        while(A[0][j]>=temp && i<j) j--;
        while(A[0][i]<=temp && i<j)i++;
        if(i<j)
        {
            change(&A[0][i],&A[0][j]);
            change(&A[1][i],&A[1][j]);
        }
}
    change(&A[0][left],&A[0][i]);
    change(&A[1][left],&A[1][i]);
    Qsort(A,left,i-1);
    Qsort(A,i+1,right);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值