对于字符串 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 由大写英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/greatest-common-divisor-of-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
一般方法
一.找长度为n的循环块
对于str1 = "ABCABC",那么有一个长度为3 的循环块。以str1为例,长度n=2.
- 取出长度为n的前缀,以str1为例,长度n=2,则前缀为AB。
- 将str1与前缀比较。将长度为n的子串(如图)与前缀比较,都相同,则找出循环块,为前缀。AB分别与CA、BC比较。
- 否则,不存在满足条件的循环块。
二.求两字符串的最大公因子
- 找循环块(不同长度的循环块,先从大的找,最大为max(len1,len2))
- 如果两字符串同长度的循环块存在且相同,即为所求,返回。
- 否则,返回空“”。
代码如下:
//从str中找长度为n的循环块
string getstr(int n,string str)
{
int len = str.length();
string temp = str.substr(0,n);
bool flag=true;
for(int i=n; i<len; i+=n)
{
if(str.substr(i,n)!=temp)
{
flag=false;
break;
}
}
if(!flag) return "";
else return temp;
}
//找两字符串的最大公因串
string gcdOfStrings(string str1, string str2)
{
int len1 = str1.length();
int len2 = str2.length();
int n = max(len1,len2);
for(int i=n; i>0; i--)
{
if(getstr(i,str1)!=""&&getstr(i,str1)==getstr(i,str2))
{
return getstr(i,str1);
}
continue;
}
return "";
}
数学方法
代码:
string gcdOfStrings(string str1, string str2)
{
int len1 = str1.length();
int len2 = str2.length();
if(str1+str2==str2+str1)
return str1.substr(0,__gcd(len1,len2));
else return "";
}