给定两个字符串a和b,定义式子a*b表示两个字符串的连接.例如a="abc",b="def",

2024-12-27 09:03:08
推荐回答(1个)
回答1:

计算给定字符串的最小重复子串;

若字符串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。

对于这个+运算符重载,返回类型与包含类一样,但这种情况并不是必需的。两个参数就是要操作的对象。对于二元运算符(带两个参数),如+和-运算符,第一个参数是放在运算符左边的值,第二个参数是放在运算符右边的值。