【leetcode】字符串的最大公因子

 

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

 

posted @ 2020-09-27 17:23  温暖了寂寞  阅读(158)  评论(0编辑  收藏  举报