1. 题目背景与核心需求解析
这道来自LeetCode经典75题的字符串最大公因子问题(编号1071),是各大厂笔试面试中的高频考题。题目要求:对于两个字符串str1和str2,找出能满足X能除尽str1和str2的最大子串X。通俗来说,就是找到两个字符串共有的"最大重复单元"。
举个例子:
- str1 = "ABCABC", str2 = "ABC" → 输出"ABC"
- str1 = "ABABAB", str2 = "ABAB" → 输出"AB"
- str1 = "LEET", str2 = "CODE" → 输出""
作为基础解法,枚举法虽然时间复杂度较高(O(n^2)),但胜在思路直观,非常适合算法新手理解字符串匹配的核心逻辑。下面我会用"庖丁解牛"的方式,带大家一步步拆解实现过程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 枚举法实现思路拆解
2.1 算法核心逻辑
枚举法的本质是暴力验证所有可能的子串候选:
- 确定可能的最大长度(两字符串长度的最大公约数)
- 从最长可能子串开始检查
- 验证该子串是否能通过重复构成原字符串
- 第一个满足条件的子串即为解
2.2 关键步骤分解
python复制def gcdOfStrings(str1: str, str2: str) -> str:
# 步骤1:确定候选子串的最大可能长度
len1, len2 = len(str1), len(str2)
candidate_len = math.gcd(len1, len2)
# 步骤2:从最长到最短检查候选子串
for l in range(candidate_len, 0, -1):
if candidate_len % l != 0:
continue
# 步骤3:获取当前长度的候选子串
candidate = str1[:l]
# 步骤4:验证是否能构成原字符串
if check(candidate, str1) and check(candidate, str2):
return candidate
