周期串问题

问题描述:

如果一个字符串可以由某个长度为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的测试用例都过了。这点不是很明白。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值