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

题目描述

给定两个字符串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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值