计算给定字符串的最小重复子串;
若字符串S已知,则输出N的值范围也就固定了,就在S长度的约数中。
先把约数求出来,再从小到大以约数为单位一个一个对比,符合条件的约数即所求结果。
#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "malloc.h"
//求子串
char* Sub(char a[],int i,int j)
{
int k;
char *s;
s = (char*)malloc(j-i+1);
for(k = 0; k < j-i+1; k++)
s[k] = a[k+i];
s[k] = '\0';
return s;
}
int Index(char a[],char b[])
{
int i,j,n;
i = 0;
j = 0;
n = 0;
while(i < strlen(a))
{
if(a[i] == b[j])
{
i++;
j++;
if(b[j] == '\0')//若匹配了,则子串的下标回溯到0,再次匹配直到原串结束
{
j = j-strlen(b);
n++;
}
}
else
break;
}
if(i == strlen(a))
{
printf("%d ",n);
return 1;
}
else
return 0;
}
int main()
{
char str[100];
char *s;
int i;
scanf("%s",str);
for(i = 0; i < strlen(str); i++)
{
s = (char*)malloc(i+1);
s = Sub(str,0,i);//求子串(长度从1开始)
//printf("%s\n",s);
if(Index(str,s))//若为真,则能求出每个字符串s输出最大的n,若为假,则取下一个子串进行匹配
break;
}
getch();
return 0;
}
扩展资料
运算符重载的声明方式与方法的声明方式相同,但operator关键字告诉编译器,它实际上是一个运算符重载,后面是相关运算符的符号,在本例中就是+。返回类型是在使用这个运算符时获得的类型。在本例中,把两个矢量加起来会得到另一个矢量,所以返回类型就是Vector。
对于这个+运算符重载,返回类型与包含类一样,但这种情况并不是必需的。两个参数就是要操作的对象。对于二元运算符(带两个参数),如+和-运算符,第一个参数是放在运算符左边的值,第二个参数是放在运算符右边的值。