Python 求最长公共子串 ?
参考答案:
在 Python 中,可以使用动态规划(Dynamic Programming)的方法来解决最长公共子串(Longest Common Substring)的问题。以下是一个示例代码:
def longest_common_substring(s1, s2):
m = len(s1)
n = len(s2)
# 创建一个二维数组 dp,用于存储子问题的解
dp = [[0] * (n + 1) for _ in range(m + 1)]
max_len = 0 # 最长公共子串的长度
end = 0 # 最长公共子串在 s1 中的结束位置
# 动态规划求解
for i in range(1, m + 1):
for j in range(1, n + 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 = i
else:
dp[i][j] = 0
# 提取最长公共子串
start = end - max_len
return s1[start:end]
# 示例
s1 = "ABCDEFG"
s2 = "XYZBCDEFG"
print(longest_common_substring(s1, s2)) # 输出:BCDEFG
这段代码首先创建了一个二维数组 dp,其中 dp[i][j] 表示 s1 的前 i 个字符和 s2 的前 j 个字符之间的最长公共子串的长度。然后,使用两个嵌套的循环遍历 s1 和 s2 的所有字符,根据字符是否相等来更新 dp 数组。如果 s1[i - 1] 等于 s2[j - 1],则 dp[i][j] 等于 dp[i - 1][j - 1] + 1,表示最长公共子串的长度加 1。同时,如果 dp[i][j] 大于当前记录的最长公共子串的长度 max_len,则更新 max_len 和 end 的值。如果 s1[i - 1] 不等于 s2[j - 1],则 dp[i][j] 等于 0,表示当前字符不能构成更长的公共子串。最后,根据 max_len 和 end 的值,提取出最长公共子串并返回。