问题描述:
如果一个字符串可以由某个长度为k的字符串重复多次得到,则该串以k为周期。例如,abcabcabcabc以3为周期(注意,它也以6和12为周期)。输入一个长度不超过80的串,输出它的最小周期。
原型:
int GetMinPeriod(char *string);
输入参数:
char * string:字符串。
返回值:
int 字符串最小周期。
样例输入:abcabcabc
样例输出:3
问题分析:
该编程题没有相关算法和比较复杂的编程语言的考察,是最基本的编程基础问题。
方法一:没有用任何算法和编程语言特性,就是对其逻辑用编程实现,最终对相关测试用例还是不行。以失败告终。
int GetMinPeriod(char * inputstring) //一开始自己写的,还是有些问题
{
int num=1,temp1,temp2=0;
char *s1;
s1=inputstring;
s1++;
while(*s1!='\0') //没有用任何算法和语言特性,就是对其逻辑用编程实现
{
while((*s1!=*inputstring)&&(*s1!='\0'))
{
s1++;
num++;
}
if(*s1=='\0')
return 0;
temp1=num;
while(*s1==*inputstring && *s1!='\0')
{
s1++;
inputstring++;
temp1--;
temp2++;
if(temp1==0 && *s1=='\0')
return num;
}
inputstring=inputstring-temp2;
num=num+temp2;
temp2=0;
}
return 0;
}
方法二:(参考相关代码)求最小周期的经典方法,是在字符串的长度范围内遍历的
#include<stdio.h>
#include<stdlib.h>
int GetMinPeriod(char *inputstring)
{
int len=0;
char *p=inputstring;
while(*p++)
len++; //求inputstring的长度
for(int i=1;i<=len;i++) //外层循环用于遍历字符串长度,求最小周期
{
int flag=1;
if(len%i!=0) //简化计算量,字符串的最小周期一定能整除整个字符串的长度
continue;
else
{
for(int j=0;j<len-i;j++) //第j个字符与第j+i个字符进行比较,故j<l-i.
{
if(inputstring[j]!=inputstring[j+i])
{
flag=0;
break;
}
}
}
if(flag==1)
{
return i;
}
}
return len;
}
void main()
{
char *s;
s=(char *)malloc(100);
int num;
printf("please input string:\n");
scanf("%s",s);
num=GetMinPeriod(s);
printf("%d\n",num);
}
这个编程还有点小问题,如样例输入abc,输出为3。按照最小周期的定义,输出应该为0(这种非周期字符串测试用例应该是不会存在的吧?)。但是华为OJ的测试用例都过了。这点不是很明白。