这是题目链接
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的情况。
这道题出现的错误说明了对于一道题的解题模型要考虑全面,当用特殊来总结全部的时候,一定要考虑周全。