1.题目描述
难度简单125
对于字符串
S
和T
,只有在S = T + ... + T
(T
与自身连接 1 次或多次)时,我们才认定 “T
能除尽S
”。返回最长字符串
X
,要求满足X
能除尽str1
且X
能除尽str2
。
示例 1:
输入:str1 = "ABCABC", str2 = "ABC" 输出:"ABC"示例 2:
输入:str1 = "ABABAB", str2 = "ABAB" 输出:"AB"示例 3:
输入:str1 = "LEET", str2 = "CODE" 输出:""
提示:
1 <= str1.length <= 1000
1 <= str2.length <= 1000
str1[i]
和str2[i]
为大写英文字母
2.解题思路
假设两字符串的长度分别为l1, l2, 他们的最大公约数是k。
现已知道两字符串存在最大公因子(第一行代码),假设该字串的长度为k'。
下面开始反证,
若k' < k,而根据题意k'也为l1, l2 的公约数,则k'必能被k整除,这说明我们可以将该字串的长度扩充到k,同时保持它仍然为str1和str2的公因子,所以这种情况下这个长度为k'的公因子就不是最大公因子。
若k' > k, 根据题意k'为l1, l2 的公约数, 而k为最大公约数,而这时出现了一个比最大公约数还大的公约数,这是矛盾的,所以这种情况也是不可能的。
综合以上,最大公因子的长度必然等于两串长度的最大公约数。
作者:gao-xian-feng
链接:https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/solution/tan-tan-zheng-ming-wei-shi-yao-liang-zi-fu-chuan-c/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
3.代码实现
class Solution(object):
def gcdOfStrings(self, str1, str2):
"""
:type str1: str
:type str2: str
:rtype: str
"""
import fractions
if str1 + str2 != str2 + str1:
return ""
else:
return str1[:fractions.gcd(len(str1), len(str2))]