Leetcode刷题之 1071. 字符串的最大公因子

题目描述

对于字符串 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 由大写英文字母组成

思路

百思不得其解, 最后看了别人写的题解, 将两个字符串相加, str1+str2若和str2+str1相同, 证明存在x可以除尽两个字符串.

下一步求出两个字符串长度的最大公约数, 就可以确定x的长度, 然后直接按长度截取就得到x了.

代码

char *strcon(char *str1, char *str2) // 把两个字符串合成一个的函数
{
    char *p = malloc(strlen(str1) + strlen(str2) + 1);
    memset(p, 0, strlen(str1) + strlen(str2) + 1);
    int k = 0;
    while(*str1 != '\0')
        p[k++] = *str1++;
    while(*str2 != '\0')
        p[k++] = *str2++;
    p[k] = '\0';
    return p;
}

char * gcdOfStrings(char * str1, char * str2){
    char *sum1 = strcon(str1, str2);
    char *sum2 = strcon(str2, str1);
    if(strcmp(sum1, sum2))
        return "";
    free(sum1);
    free(sum2);
    int len1 = strlen(str1), len2 = strlen(str2);
    int maxlen = 0;
    for(int i = 1; i <= (len1 > len2 ? len2 : len1); i++) // 求最大公约数作为x的长度
        if(len1 % i == 0 && len2 % i == 0 && i > maxlen)
            maxlen = i;
    char *sum = malloc(maxlen + 1);
    for(int i = 0; i < maxlen; i++) // 按长度截取字符串
        sum[i] = str1[i];
    sum[maxlen] = '\0'; // 最后不要忘了加'\0'
    return sum;
}
posted @ 2023-08-28 15:48  孤独熬夜家  阅读(18)  评论(0编辑  收藏  举报