1. 项目概述:字符串处理中的经典问题
字符串处理是编程面试和实际开发中的高频考点,而查找最长公共子串(Longest Common Substring)更是华为等大厂机考的经典题型。这个问题要求从两个给定的字符串中找出最长的连续相同字符序列。与最长公共子序列(LCS)不同,子串要求字符必须是连续的。
在实际工作中,这个算法可以应用于DNA序列比对、论文查重系统、代码相似度检测等场景。华为作为通信设备巨头,其考题往往与网络配置管理、日志分析等实际业务相关——例如分析设备日志中的异常模式时,就需要这类字符串匹配技术。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心算法解析
2.1 动态规划解法
最经典的解决方案是动态规划(DP),时间复杂度O(mn),空间复杂度O(mn)。我们构建一个二维DP数组,其中dp[i][j]表示以a[i]和b[j]结尾的最长公共子串长度:
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:
dp[i][j] = 0
return a[end_pos-max_len:end_pos]
关键点:当字符匹配时,状态转移方程为dp[i][j] = dp[i-1][j-1] + 1;否则重置为0。需要同时记录最大长度和结束位置。
2.2 后缀自动机优化
对于超长字符串(如DNA序列),可以使用后缀自动机将时间复杂度优化到O(m+n)。虽然华为机考通常不需要这种高级解法,但在实际工程中处理GB级日志时很有价值:
- 先为字符串a构建后缀自动机
- 用字符串b在后缀自动机上运行匹配
- 记录匹配过程中的最大长度
3. 华为机考的特殊要求
3.1 输入输出规范
华为OJ平台通常要求严格符合输入输出格式。示例输入可能是:
code复制abcdefg
defabc
对应的函数接口可能要求:
python复制def solution(input_str):
# 处理输入
a, b = input_str.split('\n')
# 核心逻辑
result = longest_common_substring(a, b)
# 返回结果
return result
3.2 性能边界处理
需要注意的特殊case:
- 两个字符串完全相同(返回任
