1071.Greatest Common Divisor of Strings === ###### tags: `Easy`,`Math`,`String` [1071. Greatest Common Divisor of Strings](https://leetcode.com/problems/greatest-common-divisor-of-strings/) ### 題目描述 For two strings `s` and `t`, we say "`t` divides `s`" if and only if `s = t + ... + t` (i.e., `t` is concatenated with itself one or more times). Given two strings `str1` and `str2`, return *the largest string* `x` *such that* `x` *divides both* `str1` *and* `str2`. ### 範例 **Example 1:** ``` Input: str1 = "ABCABC", str2 = "ABC" Output: "ABC" ``` **Example 2:** ``` Input: str1 = "ABABAB", str2 = "ABAB" Output: "AB" ``` **Example 3:** ``` Input: str1 = "LEET", str2 = "CODE" Output: "" ``` **Constraints**: * 1 <= `str1.length`, `str2.length` <= 1000 * `str1` and `str2` consist of English uppercase letters. ### 解答 #### C++ ##### 思路 - 如果gcdString存在,也就是兩個字串都是由gcdString組成,則這兩個字串無論先後,相加起來的結果一定相同。 - 所有的cdString也會是gcdString的一部分,因此直接針對兩個字串長度取最大公因數就好。 ```cpp= class Solution { public: string gcdOfStrings(string str1, string str2) { return str1 + str2 == str2 + str1 ? str1.substr(0, gcd(str1.size(), str2.size())): ""; } }; ``` > [name=Yen-Chi Chen][time=Wed, Feb 1, 2023] #### Python ```python= class Solution: def gcdOfStrings(self, str1: str, str2: str) -> str: return str1[:gcd(len(str1), len(str2))] if str1 + str2 == str2 + str1 else "" ``` > [name=Yen-Chi Chen][time=Wed, Feb 1, 2023] ```python= class Solution: def gcdOfStrings(self, str1: str, str2: str) -> str: n = min(len(str1), len(str2)) gcd = '' while n != 0: if len(str1) % n == 0 and len(str2) % n == 0: gcd = str1[0:n] print(n, len(str1), len(str2)) #check str1 flag1 = (str1 == gcd*(len(str1)//n) ) #check str2 flag2 = (str2 == gcd*(len(str2)//n) ) if flag1 and flag2: return str1[:n] else: n -= 1 else: n -= 1 return "" ``` > [name=玉山] ### Reference [回到題目列表](https://hackmd.io/@Marsgoat/leetcode_every_day)