POJ 1580 && HDU 1306 String Matching(水~)

562 篇文章 1 订阅
470 篇文章 3 订阅

Description
现定义两个仅由大写字母组成的字符串的匹配程度如下:将某一字符串的首字符与另一字符串的某一字符对齐,然后后面的字符也一一对齐,直至某一字符串的串尾为止。对于每一组对齐的两个字符,若这两个字符相等,则计数。最后计算这个计数的2倍,与两串总长度的最大比值
Input
多组用例,每组用例占一行,包括两个字符串,以-1结束输入
Output
对于每组用例,输出两个字符串的最大匹配数与两串总长度的比值
Sample Input
CAR CART
TURKEY CHICKEN
MONEY POVERTY
ROUGH PESKY
A A
-1
Sample Output
appx(CAR,CART) = 6/7
appx(TURKEY,CHICKEN) = 4/13
appx(MONEY,POVERTY) = 1/3
appx(ROUGH,PESKY) = 0
appx(A,A) = 1
Solution
简单字符串处理,暴力枚举两串匹配的首字母,不断更新最大匹配值即可,最后的答案需要对最大匹配值和两串总长进行辗转相除
Code

#include<stdio.h>
#include<string.h>
#define max(x,y) (x>y?x:y)
#define min(x,y) (x<y?x:y)
int gcd(int x,int y)
{
    if(x%y!=0)
        return gcd(y,x%y);
    return y;
}
int main()
{
    int i,j,k,len1,len2,a,b,res,max;
    char c,c1[1000],c2[1000];
    while(1)
    {
        scanf("%s%s",c1,c2);
        if(strcmp(c1,"-1")==0)//输入结束条件 
            break;
        len1=strlen(c1);
        len2=strlen(c2);
        max=0;//最大匹配数 
        for(i=0;i<len1;i++)//枚举两串首字母 
            for(j=0;j<len2;j++)
            {
                res=0;//每次记录匹配数前初始化为0 
                for(k=0;k<min(len1-i,len2-j);k++)
                    if(c1[k+i]==c2[k+j])
                        res++;
                max=max(max,res);
            } 
        if(max==0||2*max-len1-len2==0)//没有匹配或者完全匹配则不用辗转相除
            printf("appx(%s,%s) = %d\n",c1,c2,2*max/(len1+len2));
        else
        {
            a=2*max;
            b=len1+len2;
            i=gcd(a,b);//辗转相除 
            a/=i;
            b/=i;
            printf("appx(%s,%s) = %d/%d\n",c1,c2,a,b);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值