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