- 力扣题目链接
- 题目:
对于字符串 s 和 t,只有在 s = t + t + t + … + t + t(t 自身连接 1 次或多次)时,我们才认定 “t 能除尽 s”。
给定两个字符串 str1 和 str2 。返回 最长字符串 x,要求满足 x 能除尽 str1 且 x 能除尽 str2 。
枚举实现
int gcd(int a,int b)
{
int t = 0;
while(b!=0)
{
t = a%b;
a = b;
b = t;
}
return a;
}
int check(char* t, char* s, int t_len)
{
while (*s != '\0')
{
for (int i = 0; i < t_len; i++)
{
if (*t != *s)
return 0;
t++;
s++;
}
t -= t_len;
}
return 1;
}
char* gcdOfStrings(char* str1, char* str2)
{
int len_str1 = strlen(str1);
int len_str2 = strlen(str2);
int gcd_num = gcd(len_str1,len_str2);
for(;gcd_num>=1;gcd_num--)
{
if(len_str1%gcd_num==0 && len_str2%gcd_num==0)
{
char *linshi = (char*)malloc(sizeof(char)*(gcd_num+1));
if(linshi==NULL)
return NULL;
for(int i=0;i<gcd_num;i++)
{
*linshi = *str1;
linshi++;
str1++;
}
*linshi = '\0';
linshi = linshi - gcd_num;
str1 = str1 -gcd_num;
if (check(linshi,str1,gcd_num)&&check(linshi,str2,gcd_num))
return linshi;
free(linshi);
}
}
return "\0";
}
- 在辗转相除求最大公因数时,不需要判断两个数的大小。假设两个数字a=12,b=30则运行过程中,t,a,b的数值如下,所以不在需要判断两个数的谁大谁小
t=12,a=12,b=30
t=6,a=30,b=12
t=0,a=12,b=6