切換
舊版
前往
大廳
主題

ZeroJudge - e348: 字串GCD 解題心得

Not In My Back Yard | 2019-08-21 22:08:21 | 巴幣 2 | 人氣 478

題目連結:


題目大意:
字串的 GCD 定義如下:
GCD(ABCABC, ABC) = ABC
GCD(ABABAB, ABAB) = AB
GCD(AAAAAA, AAAAA) = A

現給定兩個字串(只由大寫字母組成),求它們的 GCD 。如果兩字串沒有 GCD ,輸出「= =」。



範例輸入:
ABCABC ABC
ABABAB ABAB
AAAAAA AAAAA
ZERO JUDGE


範例輸出:
ABC
AB
A
= =


解題思維:
題目的 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 ,即輸出「= =」。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作