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


目录
相关文章
|
3月前
|
存储 缓存 算法
【经典算法】LeetCode 1143:最长公共子序列Java/C/Python3实现含注释说明,Medium)
【经典算法】LeetCode 1143:最长公共子序列Java/C/Python3实现含注释说明,Medium)
15 1
|
3月前
|
存储 算法 数据挖掘
动态规划Dynamic programming详解-最长公共子序列【python】
动态规划Dynamic programming详解-最长公共子序列【python】
|
4月前
|
Python 人工智能
讯飞星火、文心一言和通义千问同时编“贪吃蛇”游戏,谁会胜出?
讯飞星火、文心一言和通义千问同时编“贪吃蛇”游戏,谁会胜出?
80 1
讯飞星火、文心一言和通义千问同时编“贪吃蛇”游戏,谁会胜出?
|
4月前
|
Shell Unix Linux
Linux 终端命令之文件浏览(3) less
Linux 终端命令之文件浏览(3) less
57 0
Linux 终端命令之文件浏览(3) less
|
4月前
|
Rust
Rust 编程小技巧摘选(8)
Rust 编程小技巧摘选(8)
178 0
Rust 编程小技巧摘选(8)
|
4月前
|
算法 C++ 机器人
力扣 C++|一题多解之动态规划专题(1)
力扣 C++|一题多解之动态规划专题(1)
57 0
力扣 C++|一题多解之动态规划专题(1)
|
4月前
|
C++ Python 索引
Python Numpy入门基础(二)数组操作
Python Numpy入门基础(二)数组操作
49 0
Python Numpy入门基础(二)数组操作
|
4月前
|
C++ 存储
力扣C++|一题多解之数学题专场(1)
力扣C++|一题多解之数学题专场(1)
40 0
力扣C++|一题多解之数学题专场(1)
|
5天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从零基础到实战应用
【9月更文挑战第15天】本文将引导读者从零开始学习Python编程,通过简单易懂的语言和实例,帮助初学者掌握Python的基本语法和常用库,最终实现一个简单的实战项目。文章结构清晰,分为基础知识、进阶技巧和实战应用三个部分,逐步深入,让读者在学习过程中不断积累经验,提高编程能力。
|
1天前
|
数据可视化 Python
Python编程中的数据可视化技术
【9月更文挑战第19天】在数据驱动的时代,将复杂的数据集转化为直观易懂的视觉表达至关重要。本文将深入探索Python中的数据可视化库,如Matplotlib和Seaborn,并指导读者如何运用这些工具来揭示数据背后的模式和趋势。文章不仅会介绍基础图表的绘制方法,还将讨论高级技巧以提升图表的信息丰富度和吸引力。