Long long words

这是题目链接

https://vjudge.net/contest/207152#problem/L

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=396

简单说一下题目,是要在给定的一组字符串中找出最小的重复单元数,如GoGo就是2,而abcaabca就是4,abcd也是4。

#include<stdio.h>
#include<string.h>
int main(void)
{
	char a[80];
	int Num,len;
	int N,i,j,k;
	scanf("%d",&N);
	while(N--)
	{
		scanf("%s",a);
		len = strlen(a);
		for( i = 0 ; i < len-1 ; i++ )  //从第一个字符开始查找
		{
			for ( j = i+1 ; j < len ; j++ )  
			{
				if ( a[i] == a[j] )  //如果找到两个相同的字符,便开始判断
				{
					for (k = i+1 ; k < j-i ; k++ )
					{
						if(a[k] != a[k+j])  //有一个不符合即继续寻找
							break;	
					}
					if ( k == j-i )  //全部符合即为题目要求
					{
						Num = j-i;
						goto Tl;  //直接输出
					}
				}
			}
		}
		if (i == len-1 )
			Num = len;
		Tl:
		if( len % Num != 0 )  //判断所求的的长度是否是最大长度的因子
			Num = len;
		printf("%d\n",Num);
		if(N != 0)
			printf("\n");
	} 
		
	return 0;
}
这个代码的思路比较简单,也比较容易想,但是提交时候却提示WA了,然而自己找了两天也没有找出来,当时就很难受。后来发现可能是周期不够,可能会出现边界不符,比如会有这种情况:ababad,不能准确地判断答案。学习了别人的代码后转换思想,对原代码进行了改进

#include<stdio.h>
#include<string.h>
int main(void)
{
	char a[80];
	int Num,len,n;
	int N,i,j,k;
	scanf("%d",&N);
	while(N--)
	{
		scanf("%s",a);
		len = strlen(a);
		for ( j = 1 ; a[j] != '\0' ; j++ )
		{
			if ( a[0] == a[j] )
			{
				if ( len % j != 0 )  //先判断求得是否是最大长度的因子,不是则继续寻找
					continue;
				for (k = 0 ; k < j ; k++ )
				{
					for ( n = 1 ; n*j+k < len ; n++ )  //用n来做周期
					{
						if(a[k] != a[n*j+k])//判断每一个周期对应的字母都是否相同
						{
							goto Ag;  //每一个周期都一样即为所求长度
						}		
					}		
				}
				Num = j;  //所有字符搜索完都没有相同的,那么最小长度就是字符串的总长度
				goto Tl;
			}
			Ag: ;
		}
		Num = j;			
		Tl:
		printf("%d\n",Num);
		if(N != 0)
			printf("\n");
	} 
		
	return 0;
}

这个代码当然是AC,因为它对所有的周期都进行了判断,所以避免了上面提到的ababad的情况。

这道题出现的错误说明了对于一道题的解题模型要考虑全面,当用特殊来总结全部的时候,一定要考虑周全。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值