LeetCode 1071. 字符串的最大公因子

81 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第27天,点击查看活动详情

一、题目描述:

1071. 字符串的最大公因子 - 力扣(LeetCode) (leetcode-cn.com)

对于字符串 s 和 t,只有在 s = t + ... + t(t 自身连接 1 次或多次)时,我们才认定 “t 能除尽 s”。

给定两个字符串 str1 和 str2 。返回 最长字符串 x,要求满足 x 能除尽 str1 且 X 能除尽 str2 。

 

示例 1:

输入:str1 = "ABCABC", str2 = "ABC"
输出:"ABC"

示例 2:

输入:str1 = "ABABAB", str2 = "ABAB"
输出:"AB"

示例 3:

输入:str1 = "LEET", str2 = "CODE"
输出:""

 

提示:

1 <= str1.length, str2.length <= 1000 str1 和 str2 由大写英文字母组成

二、思路分析:

最大公因子串的长度sublen一定是str1和str2的长度的最大公因数,所以先计算两串长度len1,len2,再求出len1,len2的最大公因数,记为最大公因子串的长度sublen,把假设的substr的值赋值为str1的前sublen个元素,将substr依次和str1,str2比对,如果出现匹配不上的说明答案为空串,全匹配完的话,最后返回substr

三、AC 代码:

int gcd(int a,int b)
{
   // printf("%d %d\n",a,b);
    if(0==b)
    {
        return a;
    }
    else
    {
        return gcd(b,a%b);
    }
}

char * gcdOfStrings(char * str1, char * str2){
    int len1=0,len2=0;
    while(*(str1+len1)!=0)
    {
        len1++;
    }
    while(*(str2+len2)!=0)
    {
        len2++;
    }
    int sublen=gcd(len1,len2);
    char *substr;
    substr=(char*)malloc((sublen+1)*sizeof(char));
    *(substr+sublen)='\0';
    for(int i=0;i<sublen;i++)
    {
        *(substr+i)=*(str1+i);
    }

    for(int i=0;i<len1;i++)
    {
        if(*(str1+i)!=*(substr+(i%sublen)))
        {
            *substr='\0';
            return substr;
        }
    }

    for(int i=0;i<len2;i++)
    {
        if(*(str2+i)!=*(substr+(i%sublen)))
        {
            *substr='\0';
            return substr;
        }
    }
    return substr;
}

范文参考:

一行代码,公约数思路简单,性能高效达到100 - 字符串的最大公因子 - 力扣(LeetCode)

1071. 字符串的最大公因子 题解 - 力扣(LeetCode)

1071. 字符串的最大公因子##菜鸟代码,详细注释##(100%87%) - 字符串的最大公因子 - 力扣(LeetCode)