題目連結:
字串的 GCD 定義如下:
GCD(ABCABC, ABC) = ABC
GCD(ABABAB, ABAB) = AB
GCD(AAAAAA, AAAAA) = A
現給定兩個字串(只由大寫字母組成),求它們的 GCD 。如果兩字串沒有 GCD ,輸出「= =」。
ABCABC ABC
ABABAB ABAB
AAAAAA AAAAA
ZERO JUDGE
題目的 GCD 定義有點模糊,但大體如下:
將一字串拆成各個部分,每個部分的「內容」皆一致,此即為此字串的一個「因子」。例如 ABCABC 可為 1 個 ABCABC 或 2 個 ABC 所組成。
而兩字串的 GCD 就是找共同的且長度最長的「因子」。例如 AAAA 跟 AA 有 A 跟 AA 這兩個共同的因子,而最長的是 AA。因此 GCD(AAAA, AA) = AA 。
從上面就可以看出一些如何求字串 GCD 的作法:
首先,分解那個長度較短的字串。因為因子要把字串分成好幾個等分,因此因子的長度必為原字串長度的因數。所以像字串 ABCABC 只需判斷 A 、 AB 、 ABC 、 ABCABC 是否是因子即可,其他長度的子字串不需要判斷。
接著,從長的、可能的因子開始判斷。以 ABABAB 為例:
先判斷長度為 6 ,也就是 ABABAB 字串本身,而其一定是自身的因子。
再來判斷長度為 3 ,也就是 ABA 是否為因子:
ABABAB,因為這兩個字元不相等(兩個等分的開頭不一樣),因此 ABA 不是因子。
接著判斷長度為 2 ,也就是 AB :
ABABAB → ABABAB → ABABAB → ABABAB ,因為每個等分都一樣,因此 AB 是 ABABAB 的一個因子。
接著判斷長度 1 ,也就是 A 。同長度 3 的情況,其並不是因子。
然後,在找到上面字串的因子時,同樣也判斷另一字串是否也有此因子(用類似上面的方式判斷)。如果也有,即是題目所求的 GCD 。
如果到最後都沒找到過 GCD ,即輸出「= =」。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。