char *gcdOfStrings(char *str1, char *str2)
{
//if (strstr(str1, str2) == NULL && strstr(str2, str1) == NULL) 原答案
//如果最大公因子有的话,那必定是有一个包含其中一个,实际就是长的包含短的
if (!(strstr(str1, str2) == str1 || strstr(str2, str1) == str2))
return "";
int p_a = 0, p_b = 0, cmp = 0;
do
{
cmp = strcmp(str1 + p_a, str2 + p_b);
//那个字符串较长对应指针就忘前加上较短字符串的长度,相当于约掉
cmp > 0 ? (p_a += strlen(str2 + p_b)) : (p_b += strlen(str1 + p_a));
//if (strstr(str1 + p_a, str2 + p_b) == NULL && strstr(str2 + p_b, str1 + p_a) == NULL)
//较长的字符串约掉短的字符串后,剩下的继续比较,也是继续符合一个包含其中一个
if (!(strstr(str1 + p_a, str2 + p_b) == (str1 + p_a) || strstr(str2 + p_b, str1 + p_a) == (str2 + p_b)))
return "";
} while (cmp);
return str1 + p_a;
}
char * gcdOfStrings(char * str1, char * str2){
int len1=strlen(str1),len2=strlen(str2);
int i,j;
int minlen= (len1<len2)? len1:len2;
char* s=(char *)calloc(len1+len2+1,sizeof(char));
char* buffer=(char *)calloc(minlen+1,sizeof(char));
strcat(s,str1);
strcat(s,str2);
for (i=minlen; i>0; i--)
{
if (len1 % i || len2 % i) continue;
memcpy(buffer,s,i);
for (j=i; j<len1+len2; j+=i)
{
if (memcmp(buffer,&s[j],i))
break;
}
if (j==len1+len2)
return buffer;
memset(buffer,0,i);
}
return "";
}