题解 | #Coincidence#

Coincidence

http://www.nowcoder.com/practice/f38fc44b43cf44eaa1de407430b85e69

最长公共子序列

题目要求:对字符串S1(长度为n)和S2(长度为m)求公共子串S3,并且S3的长度最大,求该长度

动态规划分析:

保存结果:dp[i][j]表示以S1[i]结尾和S2[j]结尾的最长公共子序列的长度

递推起点: dp[i][0] = 0; dp[0][j] = 0;(同时也是边界值处理)

递推公式:

①如果S1[i] == S2[j] => dp[i][j] = dp[i - 1][j - 1] + 1

②如果S1[i] != S2[j] => dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])

最终解为:dp[n - 1][m - 1](下标从1开始)

def maxCommonSubSeq():
    while True:
        try:
            s1 = input()
            s2 = input()
            # 给s1和s2前面拼接一个空串,使得字符串实际内容下标从1开始
            s1 = '\0' + s1
            s2 = '\0' + s2
            n = len(s1)
            m = len(s2)
            dp = [[0 for j in range(m)] for i in range(n)]
            for i in range(n):
                dp[i][0] = 0 # 边界值
                for j in range(m):
                    dp[0][j] = 0 # 边界值
                    if s1[i] == s2[j]:
                        dp[i][j] = dp[i - 1][j - 1] + 1
                    else:
                        dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
            print(dp[n - 1][m - 1]) # 最终解
        except (EOFError, KeyboardInterrupt):
            break


if __name__ == '__main__':
    maxCommonSubSeq()
全部评论

相关推荐

黑皮白袜臭脚体育生:简历统一按使用了什么技术实现了什么功能解决了什么问题或提升了什么性能指标来写会更好另外宣传下自己的开源仿b站微服务项目,GitHub已经410star,牛客上有完整文档教程,如果觉得有帮助的话可以点个小星星,蟹蟹
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务