python-leetcode-字符串的最大公因子

1071. 字符串的最大公因子 - 力扣(LeetCode)

这个问题的本质是求 两个字符串的最大公因子 (Greatest Common Divisor, GCD)。可以使用 最大公因子算法 (GCD) 来解决。

解题思路

  1. 找出两个字符串的公共前缀,如果它们有相同的前缀,那么它们可能有公共因子。
  2. 使用数学上的 GCD 方法,找到 str1str2 长度的最大公因子 gcd(len(str1), len(str2))
  3. 截取 str1 的前 gcd_length 个字符,它就是我们要找的最大公因子字符串。

Python 代码

from math import gcd

def gcdOfStrings(str1: str, str2: str) -> str:
    if str1 + str2 != str2 + str1:  # 如果拼接后不相等,说明没有公因子
        return ""
    gcd_length = gcd(len(str1), len(str2))  # 计算最大公因数
    return str1[:gcd_length]  # 提取前缀作为最大公因子

# 示例
print(gcdOfStrings("ABCABC", "ABC"))  # 输出 "ABC"
print(gcdOfStrings("ABABAB", "ABAB"))  # 输出 "AB"
print(gcdOfStrings("LEET", "CODE"))  # 输出 ""

解释

  1. str1 + str2 == str2 + str1 是判断 str1str2 是否由相同的子串重复构成的关键。
  2. gcd(len(str1), len(str2)) 计算两个字符串长度的最大公因数。
  3. str1 的前 gcd_length 个字符作为答案。

这个方法的时间复杂度是 O(N + M),其中 NM 分别是 str1str2 的长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值