📜  打印最长的公共子串(1)

📅  最后修改于: 2023-12-03 15:25:46.256000             🧑  作者: Mango

打印最长的公共子串

在字符串处理中,公共子串是两个或多个字符串中共享的最长子串。在本文中,我们将介绍如何获取两个字符串之间的最长公共子串,并演示如何打印输出该子串。

算法

有多种算法可以用于计算两个字符串之间的最长公共子串,例如动态规划、后缀数组和Suffix Tree。下面是使用动态规划的算法,该算法针对两个字符串的每个字符位置计算一个矩阵,并确定公共子串的长度和位置。

  1. 初始化一个矩阵,将其所有元素设置为0。
  2. 遍历每个字符位置,如果相应的字符串的字符匹配,则将矩阵中相应位置的值加1。
  3. 如果矩阵中的某个值大于之前的记录,则更新记录,并将其位置保存下来。
  4. 返回记录的位置和长度,以获得最长公共子串。

以下是Python代码示例:

def lcs(s1, s2):
    m = [[0] * (1 + len(s2)) for i in range(1 + len(s1))]
    longest, x_longest = 0, 0
    for x in range(1, 1 + len(s1)):
        for y in range(1, 1 + len(s2)):
            if s1[x - 1] == s2[y - 1]:
                m[x][y] = m[x - 1][y - 1] + 1
                if m[x][y] > longest:
                    longest = m[x][y]
                    x_longest = x
            else:
                m[x][y] = 0
    return s1[x_longest - longest: x_longest]
打印最长公共子串

为了打印输出最长公共子串,我们只需在上面的算法中添加一行代码将其打印出来。以下是修改版本的Python代码:

def print_lcs(s1, s2):
    m = [[0] * (1 + len(s2)) for i in range(1 + len(s1))]
    longest, x_longest = 0, 0
    for x in range(1, 1 + len(s1)):
        for y in range(1, 1 + len(s2)):
            if s1[x - 1] == s2[y - 1]:
                m[x][y] = m[x - 1][y - 1] + 1
                if m[x][y] > longest:
                    longest = m[x][y]
                    x_longest = x
            else:
                m[x][y] = 0
    result = s1[x_longest - longest: x_longest]
    print(result)

调用该函数将会打印输出最长公共子串。

示例

让我们看看如何使用上述代码来查找两个字符串之间的最长公共子串。以下是示例代码:

s1 = 'hello world'
s2 = 'world'
print_lcs(s1, s2)

运行该代码将打印输出字符串 'world',这是两个字符串之间的最长公共子串。

总结

本文介绍了如何计算和打印输出两个字符串之间的最长公共子串。虽然有多种算法可以解决此问题,但本文介绍了使用动态规划算法的一个示例。我们还提供了修改版本的Python代码,在该代码中添加了一个print语句,以便在计算完成后打印输出结果。