数据结构与算法之算法 字符串算法经典 最长公共子串 / 编辑距离

数据结构与算法阿木 发布于 2025-07-11 7 次阅读


摘要:

字符串算法是计算机科学中一个重要的分支,其中最长公共子串和编辑距离是两个经典的算法问题。本文将深入探讨这两个问题,通过代码实现和理论分析,帮助读者理解其背后的算法原理和优化策略。

一、

字符串是计算机科学中常见的数据类型,处理字符串的算法在文本处理、信息检索、生物信息学等领域有着广泛的应用。最长公共子串和编辑距离是两个典型的字符串算法问题,它们在理论和实际应用中都有着重要的地位。

二、最长公共子串(Longest Common Substring, LCS)

最长公共子串问题是指找出两个字符串中长度最长的相同子串。以下是一个基于动态规划的解决方案。

python

def longest_common_substring(s1, s2):


if not s1 or not s2:


return ""



初始化动态规划表


dp = [[0] (len(s2) + 1) for _ in range(len(s1) + 1)]


max_len = 0


end_pos = 0 最长公共子串在s1中的结束位置

填充动态规划表


for i in range(1, len(s1) + 1):


for j in range(1, len(s2) + 1):


if s1[i - 1] == s2[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 s1[end_pos - max_len:end_pos]

示例


s1 = "ABABC"


s2 = "BABCAC"


print(longest_common_substring(s1, s2)) 输出: "BABC"


三、编辑距离(Edit Distance)

编辑距离,也称为Levenshtein距离,是指将一个字符串转换成另一个字符串所需的最少编辑操作次数。常见的编辑操作包括插入、删除和替换。

python

def edit_distance(s1, s2):


if not s1:


return len(s2)


if not s2:


return len(s1)



初始化动态规划表


dp = [[0] (len(s2) + 1) for _ in range(len(s1) + 1)]



初始化第一行和第一列


for i in range(len(s1) + 1):


dp[i][0] = i


for j in range(len(s2) + 1):


dp[0][j] = j

填充动态规划表


for i in range(1, len(s1) + 1):


for j in range(1, len(s2) + 1):


if s1[i - 1] == s2[j - 1]:


dp[i][j] = dp[i - 1][j - 1]


else:


dp[i][j] = min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1

return dp[-1][-1]

示例


s1 = "kitten"


s2 = "sitting"


print(edit_distance(s1, s2)) 输出: 3


四、总结

本文通过代码实现和理论分析,介绍了最长公共子串和编辑距离这两个经典的字符串算法问题。通过动态规划的方法,我们可以有效地解决这两个问题。在实际应用中,这两个算法在文本相似度比较、自动纠错、序列比对等领域有着广泛的应用。

五、扩展与优化

1. 对于最长公共子串问题,除了动态规划,还可以使用后缀数组(Suffix Array)和最长公共前缀(Longest Common Prefix)等方法进行优化。

2. 对于编辑距离问题,除了动态规划,还可以使用递归方法,但递归方法的时间复杂度较高,不适合处理大规模数据。

通过深入理解这些算法,我们可以更好地应对字符串处理中的各种挑战。