开启掘金成长之旅!这是我参与「掘金日新计划 · 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)