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 ""; }