[LeetCode] 1071、字符串的最大公因子

題目描述

對於字符串 ST,只有在 S = T + ... + TT 與自身連接 1 次或多次)時,我們才認定 “T 能除盡 S”。返回最長字符串 X,要求滿足 X 能除盡 str1X 能除盡 str2

輸入:str1 = "ABCABC", str2 = "ABC"
輸出:"ABC"

解題思路

這個題思路太巧妙,解題方法是“輾轉相除法gcd”。我的實現。

  • 輾轉相除法
    • 看到標題裏面有“最大公因子”這個詞,於是先默寫一下 gcd 算法:int gcd(int a, int b) { return b == 0? a: gcd(b, a % b); }
    • 如果它們有公因子 abc,那麼 str1 就是 mabc 的重複,str2nabc 的重複,連起來就是 m+nabc,好像 m+nabcn+mabc 是一樣的。所以如果 str1 + str2 == str2 + str1 就意味着有解。
    • 當確定有解的情況下,最優解是長度爲 gcd(str1.length, str2.length) 的字符串。
    • 簡單理解:因爲如果兩字符串能循環以它的約數爲長度的字符串,自然也能夠循環以它爲長度的字符串,所以這個理論長度就是我們要找的最優解。

參考代碼

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);
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章