1. 问题背景与需求解析
这道题目源自华为技术岗位的编程能力考核,主要考察应聘者对字符串处理算法的掌握程度。在实际开发中,字符串匹配是高频出现的场景,比如日志分析、数据清洗、文本比对等场景都需要用到类似技术。
题目要求找出两个字符串中最长的公共连续子串。注意是连续子串(substring)而非子序列(subsequence)。举个例子:
- 字符串A:"abcdefg"
- 字符串B:"bcdxyz"
最长公共子串是"bcd",长度为3
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法思路分析
2.1 暴力解法
最直观的方法是双重循环遍历所有可能的子串组合:
- 遍历字符串A的所有子串
- 对每个子串检查是否存在于字符串B中
- 记录最长的匹配子串
时间复杂度O(n³),在字符串较长时性能较差。
2.2 动态规划解法
更优的方案是使用动态规划(DP)。我们定义一个二维数组dp,其中dp[i][j]表示以A[i]和B[j]结尾的最长公共子串长度。
状态转移方程:
code复制如果 A[i] == B[j]:
dp[i][j] = dp[i-1][j-1] + 1
否则:
dp[i][j] = 0
这样可以将时间复杂度优化到O(n²)。
3. 代码实现详解
3.1 Python实现
python复制def longest_common_substring(a, b):
m, n = len(a), len(b)
dp = [[0]*(n+1) for _ in range(m+1)]
max_len = 0
end_pos = 0
for i in range(1, m+1):
for j in range(1, n+1):
if a[i-1] == b[j-1]:
dp[i][j] = dp[i-1][j-1] + 1
if dp[i][j] > max_len:
max_len = dp[i][j]
end_pos = i
else:
