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

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

导语:距离蓝桥杯68天  

问题来源Leedcode  

设计思路 动态规划

寄语:

4bff866ef7d24aa9b415cc48da29cba2.png

问题描述:


499bad3905a84bc596cb76e20d2a2e8a.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

f506f4d896464262a076d74bdf635cb2.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菜鸡 一起加油!


相关文章
|
6月前
|
存储 缓存 算法
【经典算法】LeetCode 1143:最长公共子序列Java/C/Python3实现含注释说明,Medium)
【经典算法】LeetCode 1143:最长公共子序列Java/C/Python3实现含注释说明,Medium)
25 1
|
6月前
|
存储 算法 数据挖掘
动态规划Dynamic programming详解-最长公共子序列【python】
动态规划Dynamic programming详解-最长公共子序列【python】
|
7月前
|
Python 人工智能
讯飞星火、文心一言和通义千问同时编“贪吃蛇”游戏,谁会胜出?
讯飞星火、文心一言和通义千问同时编“贪吃蛇”游戏,谁会胜出?
114 1
讯飞星火、文心一言和通义千问同时编“贪吃蛇”游戏,谁会胜出?
|
7月前
|
Shell Unix Linux
Linux 终端命令之文件浏览(3) less
Linux 终端命令之文件浏览(3) less
77 0
Linux 终端命令之文件浏览(3) less
|
7月前
|
Rust
Rust 编程小技巧摘选(8)
Rust 编程小技巧摘选(8)
213 0
Rust 编程小技巧摘选(8)
|
7月前
|
算法 C++ 机器人
力扣 C++|一题多解之动态规划专题(1)
力扣 C++|一题多解之动态规划专题(1)
66 0
力扣 C++|一题多解之动态规划专题(1)
|
7月前
|
C++ Python 索引
Python Numpy入门基础(二)数组操作
Python Numpy入门基础(二)数组操作
59 0
Python Numpy入门基础(二)数组操作
|
7月前
|
C++ 存储
力扣C++|一题多解之数学题专场(1)
力扣C++|一题多解之数学题专场(1)
53 0
力扣C++|一题多解之数学题专场(1)
|
13天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
12天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。