栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

最大公共子序列,输出整个序列

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

最大公共子序列,输出整个序列

题目描述

给定两个字符串str1和str2,输出两个字符串的最长公共子序列。如果最长公共子序列为空,则返回"-1"。目前给出的数据,仅仅会存在一个最长的公共子序列。

示例1

输入: “1A2C3D4B56”,“B1D23A456A”
输出: “123456”

示例2

输入: “abc”,“def”
输出:"-1"

示例3

输入: “abc”,“abc”
输出: “abc”

题解:动态规划算法,dp[i][j]定义为:str1在索引i处及之前的位置,str2在索引j处及之前的位置,存在公共子序列的最大长度
      需要回溯取依据取公共子序列字符
      状态转移方程为:如果s1[i - 1] == s2[j - 1],则dp[i][j] = dp[i - 1][j - 1] + s2[j - 1]
                     如果s1[i - 1] != s2[j - 1], 则dp[i][j]为dp[i - 1][j]和dp[i][j - 1]中字符串长度最长的那个
                     最后返回dp[m][n]
'''
class Solution:
    def LCS(self , s1 , s2 ):
        # write code here
        m, n = len(s1), len(s2)
        dp = [['' for _ in range(n + 1)] for _ in range(m + 1)]
        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] + s2[j - 1]
                    print("dp[i][j]:", dp[i][j])
                else:
                    if len(dp[i][j - 1]) > len(dp[i - 1][j]):
                        dp[i][j] = dp[i][j - 1]
                    else:
                        dp[i][j] = dp[i - 1][j]
        if not dp[m][n]:
            return ("-1")
        return dp[m][n]
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/269265.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号