poj 1580 String Matching【gcd辗转相除法】

简介:

开始想用类似“错车”的思路去解决,但是发现不是太好着手,还是选用首字母定位的方法去解决的

题意:现定义两个仅由大写字母组成的字符串的匹配程度如下:将某一字符串的首字符与另一字符串的某一字符对齐,然后后面的字符也一一对齐,直至某一字符串的串尾为止。对于每一组对齐的两个字符,若这两个字符相等,则计数。最后计算这个计数的2倍,与两串总长度的最大比值。


如果说这题最大的收获就是,两种方法的辗转相除法求gcd


AC的代码:

#include <stdio.h>
#include <string.h>


/*//辗转相除法的递归写法
int gcd(int a,int b)
{
if(!b) return a;
return gcd(b,a%b);
}
*/


int gcd(int a, int b)
{//辗转相除法
    while (b%a)
    {
		int t=a;
		a=b%a;
		b=t;
    }
    return a;
}

void appx(char * wo1,char * wo2)
{
	if(!strcmp(wo1,wo2))
	{
		printf("appx(%s,%s) = 1\n",wo1,wo2);
		return;
	}

	//值已经传进来了
	int len1=strlen(wo1),len2=strlen(wo2);
	int count=0;
	
	int i,j,max,common=0;
	//枚举word1和word2的首字母
	for(i=0;i<len1;i++)
	{
		for(j=0;j<len2;j++)
		{
			max=0;
			for (int i1=i,j1=j;i1<len1 && j1<len2;++i1,++j1)
				if (wo1[i1]==wo2[j1]) 
					++max;

			if (common<max) 
				common=max;
		}
	}

	if(common==0)
	{
		printf("appx(%s,%s) = 0\n",wo1,wo2);
		return;
	}

	int molecular=common*2;//分子
	int denominator=len1+len2;//分母

	int g=gcd(molecular,denominator);

	printf("appx(%s,%s) = %d/%d\n",wo1,wo2,molecular/g,denominator/g);
}


int main()
{
	char word1[105],word2[105];
	while(scanf("%s",word1))
	{
		if(!strcmp(word1,"-1"))
			return 0;
		
		scanf("%s",word2);
		
		appx(word1,word2);
	}
	
	return 0;
}


相关文章
|
7月前
|
机器学习/深度学习
CF1552A Subsequence Permutation(string排序大法)
CF1552A Subsequence Permutation(string排序大法)
25 0
|
10月前
|
C++
【PAT甲级 - C++题解】1040 Longest Symmetric String
【PAT甲级 - C++题解】1040 Longest Symmetric String
35 0
HDOJ(HDU) 1708 Fibonacci String
HDOJ(HDU) 1708 Fibonacci String
72 0
|
Go
POJ 1503 Integer Inquiry 简单大数相加
POJ 1503 Integer Inquiry 简单大数相加
64 0
LeetCode之Palindrome Number(回文数)
LeetCode之Palindrome Number(回文数)
60 0
|
存储 测试技术
(转)leetcode:Find All Anagrams in a String 滑动窗口方法总结
今天做了几道滑动窗口的题,稍微总结一下。 起因源于早上在leetcode上pick one,随机到了一个easy的题目,想着随便做了,结果半天也找不到最优解,耗时300多ms,A是A了,不过就是暴力罢了。
1644 0