1. 字符串最大公因子问题解析
今天我们来深入探讨一个看似简单但暗藏玄机的字符串问题——如何找到两个字符串的最大公因子。这个问题在LeetCode上编号1071,被归类为简单题,但其中蕴含的数学思维和优化技巧却值得我们细细品味。
1.1 问题定义与理解
题目要求我们:对于给定的两个字符串str1和str2,找出最长的字符串x,使得x能够通过重复多次分别构成str1和str2。换句话说,x就是str1和str2的"最大公约字符串"。
举个例子:
- str1 = "ABCABC", str2 = "ABC" → 输出"ABC"
- str1 = "ABABAB", str2 = "ABAB" → 输出"AB"
- str1 = "LEET", str2 = "CODE" → 输出""(空字符串)
1.2 直观解法与局限性
最直观的解法可能是暴力枚举:从较短的字符串开始,尝试所有可能的子串,检查是否能同时"除尽"两个字符串。这种方法虽然可行,但效率不高,时间复杂度为O(min(m,n)^2),其中m和n分别是两个字符串的长度。
python复制# 暴力解法示例
def gcdOfStrings(str1, str2):
shorter = min(str1, str2, key=len)
for l in range(len(shorter), 0, -1):
candidate = shorter[:l]
if (len(str1) % l == 0 and len(str2) % l == 0 and
candidate * (len(str1)//l) == str1 and
candidate * (len(str2)//l) == str2):
return candidate
return ""
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数学优化思路
2.1 关键数学洞察
这里有一个关键的数学性质:如果两个字符串有公因子字符串,那么这个公因子的长度一定是两个字符串长度的最大公约数(gcd)。这个洞察让我们可以直接定位到唯一需要检查的候选长度,而不用尝试所有可能的长度。
为什么这个性质成立?让我们用"
