Leedcode最长公共子序列 Python每日一练

简介: Leedcode最长公共子序列 Python每日一练

问题描述:

image.png

class Solution:
    def longestCommonSubsequence(self, text1: str, text2: str) -> int:
        text1,text2=' '+text1,' '+text2
        n,m=len(text1),len(text2)
        dp=[[0]*n for i in range(0,m)]#n为列,m为行
        for j in range(1,m):#遍历行
            for k in range(1,n):#每一行中 遍历列
                if text1[k]==text2[j]:
                    dp[j][k]=dp[j-1][k-1]+1
                else:
                    dp[j][k]=max(dp[j-1][k],dp[j][k-1])
        ans=0
        for _ in dp:
            ans=max(ans,max(_))
        return ans


image.png

代码设计分析: 已知两段字符串 A,B


为方便描述,我们初始化:在A,B最前面加上一个空格,代表‘空’元素


dp[i][j]代表A中第i个元素结尾的子串与B中以第j个元素结尾的子串的最长公共序列


如果A中第i个元素与B中以第j个元素相同 那么显而易见 dp[i][j]=dp[i-1][j-1]+1


否则 dp[i][j]=max(dp[i-1][j],dp[i][j-1])


着重解释dp[i][j]=max(dp[i-1][j],dp[i][j-1]):


很多人包括我自己一开始也想不明白这个下标的问题?仔细一想 还是有道理在里面的


首先:题目要求 A和B的最长公共子序列 先考虑这样一个问题:


如果A和B的长度越长,那么出现公共子序列的长度是不是越大?(是的,因为元素多了,重复的可能性就增大了)


因此我们每次考虑A子串与B子串的最长公共子序列,都要尽可能使得两者长度尽可能长!才能使得最终A和B的公共子序列最长(贪心)


所以当A子串与B子串的末尾元素不同时,我们要求A子串与B子串的最长公共子序列,最贪心的做法就是取dp[i-1][j]和dp[i][j-1]中较大的那个 ,比如dp[i-1][j],就是求A子串前i-1个元素与B子串前j个元素的最大子序列长度(已经不可能有比这个更大了的了因为已经达到最长了),dp[i][j-1]同理。


新年快乐 我是小郑 一个正在准备蓝桥杯的Py菜鸡 一起加油!


目录
相关文章
|
5月前
|
存储 缓存 算法
【经典算法】LeetCode 1143:最长公共子序列Java/C/Python3实现含注释说明,Medium)
【经典算法】LeetCode 1143:最长公共子序列Java/C/Python3实现含注释说明,Medium)
24 1
|
5月前
|
存储 算法 数据挖掘
动态规划Dynamic programming详解-最长公共子序列【python】
动态规划Dynamic programming详解-最长公共子序列【python】
|
6月前
|
Python 人工智能
讯飞星火、文心一言和通义千问同时编“贪吃蛇”游戏,谁会胜出?
讯飞星火、文心一言和通义千问同时编“贪吃蛇”游戏,谁会胜出?
106 1
讯飞星火、文心一言和通义千问同时编“贪吃蛇”游戏,谁会胜出?
|
6月前
|
Shell Unix Linux
Linux 终端命令之文件浏览(3) less
Linux 终端命令之文件浏览(3) less
68 0
Linux 终端命令之文件浏览(3) less
|
6月前
|
Rust
Rust 编程小技巧摘选(8)
Rust 编程小技巧摘选(8)
205 0
Rust 编程小技巧摘选(8)
|
6月前
|
算法 C++ 机器人
力扣 C++|一题多解之动态规划专题(1)
力扣 C++|一题多解之动态规划专题(1)
63 0
力扣 C++|一题多解之动态规划专题(1)
|
6月前
|
C++ Python 索引
Python Numpy入门基础(二)数组操作
Python Numpy入门基础(二)数组操作
57 0
Python Numpy入门基础(二)数组操作
|
6月前
|
C++ 存储
力扣C++|一题多解之数学题专场(1)
力扣C++|一题多解之数学题专场(1)
52 0
力扣C++|一题多解之数学题专场(1)
|
4天前
|
存储 数据挖掘 开发者
Python编程入门:从零到英雄
在这篇文章中,我们将一起踏上Python编程的奇幻之旅。无论你是编程新手,还是希望拓展技能的开发者,本教程都将为你提供一条清晰的道路,引导你从基础语法走向实际应用。通过精心设计的代码示例和练习,你将学会如何用Python解决实际问题,并准备好迎接更复杂的编程挑战。让我们一起探索这个强大的语言,开启你的编程生涯吧!
|
10天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
下一篇
无影云桌面