跳到主要内容

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 个字符之间的最长公共子串的长度。然后,使用两个嵌套的循环遍历 s1s2 的所有字符,根据字符是否相等来更新 dp 数组。如果 s1[i - 1] 等于 s2[j - 1],则 dp[i][j] 等于 dp[i - 1][j - 1] + 1,表示最长公共子串的长度加 1。同时,如果 dp[i][j] 大于当前记录的最长公共子串的长度 max_len,则更新 max_lenend 的值。如果 s1[i - 1] 不等于 s2[j - 1],则 dp[i][j] 等于 0,表示当前字符不能构成更长的公共子串。最后,根据 max_lenend 的值,提取出最长公共子串并返回。