Easy草稿★★★★★O(m + n) 時間 · O(m + n) 空間
MathString
Patterns🧮 數學・組合
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

1071Greatest Common Divisor of StringsMath & GeometryEasyMath & Geometry

給定兩個字串 str1str2,找出最大的字串 x,使得 x 能整除 str1str2(即 str1str2 都可以由 x 重複拼接而成)。

Example:

Input: str1 = “ABCABC”, str2 = “ABC” Output: “ABC”

Intuition

TIP

核心思路:如果 GCD 字串存在,則 str1 + str2 == str2 + str1,且 GCD 字串的長度等於兩字串長度的 GCD。

Approaches

1. Brute-Force Enumeration — O(min(m,n) * (m+n)) / O(min(m,n))
  • Idea: 列舉所有可能的 GCD 字串長度(從大到小),找到第一個能整除兩字串的
  • Time: O(min(m,n) * (m+n)) - 每個候選長度需要驗證
  • Space: O(min(m,n)) - 候選字串
class Solution {
    fun gcdOfStrings(str1: String, str2: String): String {
        val minLen = minOf(str1.length, str2.length)
        for (len in minLen downTo 1) {
            if (str1.length % len == 0 && str2.length % len == 0) {
                val candidate = str1.substring(0, len)
                if (candidate.repeat(str1.length / len) == str1 &&
                    candidate.repeat(str2.length / len) == str2) {
                    return candidate
                }
            }
        }
        return ""
    }
}
⭐ 2. GCD + Concatenation Check — O(m + n) / O(m + n)
  • Idea: 若 str1 + str2 != str2 + str1 則無解;否則答案就是前 gcd(len1, len2) 個字元
  • Time: O(m + n) - 字串拼接比較
  • Space: O(m + n) - 拼接後的字串
class Solution {
    fun gcdOfStrings(str1: String, str2: String): String {
        if (str1 + str2 != str2 + str1) return ""
        val gcdLen = gcd(str1.length, str2.length)
        return str1.substring(0, gcdLen)
    }

    private fun gcd(a: Int, b: Int): Int {
        return if (b == 0) a else gcd(b, a % b)
    }
}

🔑 Takeaways