題目描述
對於字符串 S
和 T
,只有在 S = T + ... + T
(T
與自身連接 1 次或多次)時,我們才認定 “T
能除盡 S
”。返回最長字符串 X
,要求滿足 X
能除盡 str1
且 X
能除盡 str2
。
輸入:str1 = "ABCABC", str2 = "ABC"
輸出:"ABC"
解題思路
這個題思路太巧妙,解題方法是“輾轉相除法gcd
”。我的實現。
- 輾轉相除法:
- 看到標題裏面有“最大公因子”這個詞,於是先默寫一下 gcd 算法:
int gcd(int a, int b) { return b == 0? a: gcd(b, a % b); }
- 如果它們有公因子
abc
,那麼str1
就是m
個abc
的重複,str2
是n
個abc
的重複,連起來就是m+n
個abc
,好像m+n
個abc
跟n+m
個abc
是一樣的。所以如果str1 + str2 == str2 + str1
就意味着有解。 - 當確定有解的情況下,最優解是長度爲
gcd(str1.length, str2.length)
的字符串。 - 簡單理解:因爲如果兩字符串能循環以它的約數爲長度的字符串,自然也能夠循環以它爲長度的字符串,所以這個理論長度就是我們要找的最優解。
- 看到標題裏面有“最大公因子”這個詞,於是先默寫一下 gcd 算法:
參考代碼
class Solution {
public:
string gcdOfStrings(string str1, string str2) {
if (str1 + str2 != str2 + str1)
return "";
return str1.substr(0, gcd(str1.size(), str2.size()));
}
inline int gcd(int a, int b) {
return b == 0? a: gcd(b, a % b);
}
};