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

数据结构与算法阿木 发布于 16 天前 3 次阅读


摘要:

字符串是计算机科学中常见的数据类型,处理字符串的相关问题在编程中具有广泛的应用。本文将围绕两个经典的字符串问题展开讨论:最长公共子串和编辑距离。通过分析这两个问题,我们将深入探讨字符串数据结构及其在算法中的应用。

一、

字符串是计算机科学中基本的数据结构之一,它由一系列字符组成。字符串问题在计算机科学中具有广泛的应用,如信息检索、文本编辑、生物信息学等。本文将重点介绍两个与字符串相关的经典问题:最长公共子串和编辑距离。

二、最长公共子串

最长公共子串(Longest Common Substring,LCS)是指两个字符串中长度最长的相同子串。下面我们通过一个示例来理解这个问题。

示例:字符串A = "ABCDGH",字符串B = "AEDFHR",它们的最长公共子串是 "ADH"。

1. 动态规划解法

动态规划是一种解决序列问题的有效方法。我们可以使用一个二维数组来存储子问题的解,从而避免重复计算。

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]

示例


A = "ABCDGH"


B = "AEDFHR"


print(longest_common_substring(A, B)) 输出: ADH


2. 贪心算法解法

贪心算法是一种在每一步选择最优解的方法。对于最长公共子串问题,我们可以使用贪心算法来寻找子串。

python

def longest_common_substring(A, B):


i, j = 0, 0


max_len = 0


end_pos = 0


substring = ""

while i < len(A) and j < len(B):


if A[i] == B[j]:


substring += A[i]


i += 1


j += 1


if len(substring) > max_len:


max_len = len(substring)


end_pos = i


else:


substring = ""


i = 0


j = 0

return A[end_pos - max_len:end_pos]

示例


A = "ABCDGH"


B = "AEDFHR"


print(longest_common_substring(A, B)) 输出: ADH


三、编辑距离

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

1. 动态规划解法

我们可以使用一个二维数组来存储子问题的解,从而避免重复计算。

python

def edit_distance(A, B):


m, n = len(A), len(B)


dp = [[0] (n + 1) for _ in range(m + 1)]

for i in range(m + 1):


for j in range(n + 1):


if i == 0:


dp[i][j] = j


elif j == 0:


dp[i][j] = i


elif A[i - 1] == B[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[m][n]

示例


A = "kitten"


B = "sitting"


print(edit_distance(A, B)) 输出: 3


2. 贪心算法解法

对于编辑距离问题,贪心算法并不适用,因为我们需要考虑所有可能的编辑操作。

四、总结

本文介绍了两个经典的字符串问题:最长公共子串和编辑距离。通过分析这两个问题,我们了解了字符串数据结构及其在算法中的应用。在实际编程中,我们可以根据问题的特点选择合适的算法来解决字符串问题。