迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

Python 中最长的公共子字符串

作者:迹忆客 最近更新:2023/03/01 浏览次数:

Python 中的字符串在其中存储了一系列字符以对它们执行各种操作。子字符串是这些字符串的一部分。

在本文中,我们需要找到两个给定字符串之间的最长公共子字符串,并将讨论相同的各种解决方案。

子字符串是给定字符串中连续的字符序列。它可以是任何长度。

主要问题是我们已经获得了两个字符串,我们需要找到一个在给定字符串之间共有的子字符串,并且应该是所有可能的公共子字符串中最长的。

Input: str1 = "HaveAAppleRegularly"
       str2 = "HaveAnAnApple"
Output: "Apple"

在上面的示例中,我们在给定字符串之间有两个公共子字符串,"Have""Apple"。但由于"Apple"子字符串的长度是其余子字符串中最长的;因此,它将显示为我们的结果。

可以使用递归和动态规划等各种概念来解决这个问题。

循环可用于遍历字符串。我们可以在这里使用循环遍历字符串,并在两个给定字符串之间找到我们最长的公共子字符串。

在这种方法中,我们将同时使用 forwhile 循环。以下是在 Python 中查找最长公共子字符串需要遵循的步骤。

代码示例:

str1 = "PokemonGo"
str2 = "StopPokemonLetsGo"
result=0
for i in range(len(str1)):
    for j in range(len(str2)):
        k=0
        while ((i + k) < len(str1) and (j + k) < len(str2) and str1[i + k] == str2[j + k]):
            k = k+1
        result = max(result, k)

print("Length of the longest common substring is:", result)

输出:

Length of the longest common substring is: 7

字符串的所有子字符串都可以在 O(n^2) 时间内计算出来,而检查当前子字符串是否与第二个字符串的子字符串匹配则需要 O(m) 时间。上述方法的时间复杂度为 O(n^2 * m),其中 nm 分别是两个给定字符串的长度。

然而,由于我们没有占用任何额外的空间来实现解决方案,因此上述解决方案的空间复杂度将是 O(1)

递归是指调用自身的函数。我们需要一个基本案例和递归问题的选择图。

我们将按照以下步骤查找 Python 中最长的公共子字符串。

代码示例:

def LCS(s1, s2, n, m):
    if n == 0 or m == 0:
        return 0

    if s1[n-1] == s2[m-1]:
        return 1+lcs(s1, s2, n-1, m-1)

    else:
        return max(lcs(s1, s2, n, m-1),lcs(s1, s2, n-1, m))
s1 = "pokemonGo"
s2 = "watchPokemon"
n = len(s1)
m = len(s2)
res = lcs(s1,s2,n,m)
print("Length of the longest common substring is:", res)

输出:

Length of the longest common substring is: 7

上述解决方案的时间复杂度为 O(3^(m+n)),空间复杂度为 O(m+n)

动态规划的基本思想是找到两个字符串的所有子字符串的长度,并将它们各自的长度存储在一个表中。由于使用递归,可能会出现堆栈溢出错误,因为对于大输入,递归堆栈将不断增加。

我们引入了动态规划的概念,我们在其中形成了一个表格,并将继续存储各个子字符串的结果。我们在递归中使用的相同算法也用于一些更改。

现在,我们将讨论在 Python 中查找最长公共子字符串的步骤。

代码示例:

def LCS(X, Y, m, n):

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

    for i in range(m + 1):
        for j in range(n + 1):
            if (X[i-1] == Y[j-1]):
                dp[i][j] = dp[i-1][j-1] + 1
            else:
                dp[i][j] = max(dp[i-1][j],dp[i][j-1])
    return dp[m][n]
s1 = "playbatball"
s2 = "batballwicket"
n = len(s1)
m = len(s2)
res = lcs(s1,s2,n,m)
print("Length of the longest common substring is:", res)

输出:

Length of the longest common substring is: 7

由于我们的解决方案中只有两个循环,因此上述解决方案的时间复杂度将是 O(m*n)。我们通过形成一个表来存储结果来使用额外的空间。

上述解决方案的空间复杂度为 O(m*n)

我们已经学习了三种不同的方法来查找两个给定字符串之间的最长公共子字符串。第一种方法是一种简单的方法,使用三个循环并查找给定字符串的所有子字符串,并检查所有子字符串中最长的。

第二种方法使用递归,而第三种方法使用动态编程来查找 Python 中最长的公共子字符串。第三种方法将是本文讨论的解决问题的所有解决方案中最快的方法,应该是首选方法。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Django 中的 Slug

发布时间:2023/05/04 浏览次数:173 分类:Python

本篇文章旨在定义一个 slug 以及我们如何使用 slug 字段在 Python 中使用 Django 获得独特的帖子。

Django ALLOWED_HOSTS 介绍

发布时间:2023/05/04 浏览次数:181 分类:Python

本文展示了如何创建您的 Django 网站,为公开发布做好准备,如何设置 ALLOWED_HOSTS 以及如何在使用 Django 进行 Web 部署期间修复预期的主要问题。

Django 中的 Select_related 方法

发布时间:2023/05/04 浏览次数:129 分类:Python

本文介绍了什么是查询集,如何处理这些查询以及我们如何利用 select_related() 方法来过滤 Django 中相关模型的查询。

在 Django 中上传媒体文件

发布时间:2023/05/04 浏览次数:198 分类:Python

在本文中,我们简要介绍了媒体文件以及如何在 Django 项目中操作媒体文件。

Django 返回 JSON

发布时间:2023/05/04 浏览次数:106 分类:Python

在与我们的讨论中,我们简要介绍了 JSON 格式,并讨论了如何借助 Django 中的 JsonResponse 类将数据返回为 JSON 格式。

在 Django 中创建对象

发布时间:2023/05/04 浏览次数:59 分类:Python

本文的目的是解释什么是模型以及如何使用 create() 方法创建对象,并了解如何在 Django 中使用 save() 方法。

在 Django 中为多项选择创建字段

发布时间:2023/05/04 浏览次数:75 分类:Python

在本文中,我们将着眼于为多项选择创建一个字段,并向您展示如何允许用户在 Django 中进行多项选择。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便