一.知識點
1)一組數的所有公因子都是其最大公因子的約數。
2)最大公因子的求法:輾轉相除法。
二.題目
對於字符串 S 和 T,只有在 S = T + ... + T(T 與自身連接 1 次或多次)時,我們才認定 “T 能除盡 S”。
返回最長字符串 X,要求滿足 X 能除盡 str1 且 X 能除盡 str2。
示例 1:
輸入:str1 = "ABCABC", str2 = "ABC"
輸出:"ABC"
三.思路
求出最大公因子len,判斷str1和str2的長度位len的前綴是否相等,若相等則繼續判斷str1,str2是否由其長度爲len的前綴構成。
只判斷最大公因子是因爲其餘公因子都是最大公因子的約數,即其餘公因子若滿足條件,則可以由若干其餘公因子先構成最大公因子,再由最大公因子去構成str1,str2.
四.code
class Solution {
public:
int gcd(int len1,int len2){//求最大公因子
int a=len1,b=len2;
if(a<b)swap(a,b);
while(b!=0){
int rest=a%b;
a=b;
b=rest;
}
return a;
}
string gcdOfStrings(string str1, string str2) {
int len1=str1.size(),len2=str2.size();
int g=gcd(len1,len2);
string sub1=str1.substr(0,g),sub2=str2.substr(0,g);
if(sub1!=sub2)return "";
//判斷str1是否由substr構成
for(int i=g;i<len1;i+=g){
for(int j=0;j<g;j++){
if(str1[j]!=str1[j+i])return "";
}
}
//判斷str2是否由substr構成
for(int i=g;i<len2;i+=g){
for(int j=0;j<g;j++){
if(str2[j]!=str2[j+i])return "";
}
}
return sub1;
}
};