当前位置: 首页 > news >正文

经典题目(2):最长公共子序列;最长公共子串

题目一:

给定两个字符串str1和str2,输出两个字符串的最长公共子序列。如果最长公共子序列为空,则返回"-1"。目前给出的数据,仅仅会存在一个最长的公共子序列

数据范围:0≤∣str1∣,∣str2∣≤20000≤∣str1∣,∣str2∣≤2000

要求:空间复杂度 O(n2),时间复杂度 O(n2)


方法:

公共子序列和公共子串的区别在于,公共子序列的字母或数字不一定靠在一起。

使用动态规划的方法来解决这个问题,初始化一个(m+1)行(n+1)列的dp数组(考虑字符串为空的情况,因为字符串只有一个字母或数字的时候要用到),遍历dp数组的时候(i,j),如果新遍历到的字符串对应位置的字符相等,则在旧遍历字符串基础上加一,如果新遍历到的字符串对应位置的字符不相等,则考虑dp[i][j-1]和dp[i-1][j]中的大值。

得到子序列的过程是从后向前遍历的,如果两个字符串对应位置的字符相等,就加到res中,如果不相等,就比较dp数组dp[i][j-1]和dp[i-1][j],哪个大就往哪个方向后退一步。

代码:

class Solution: def LCS(self , s1: str, s2: str) -> str: # write code here if not s1 or not s2: return '-1' # 考虑特殊情况 m=len(s1) n=len(s2) dp=[[0]*(m+1) for _ in range(n+1)] #n+1行2 m+1列1 for i in range(1,m+1): for j in range(1,n+1): if s1[i-1]==s2[j-1]: # 注意 dp 和 s1s2的对应关系 dp[j][i]=dp[j-1][i-1]+1 else: dp[j][i]=max(dp[j-1][i],dp[j][i-1]) res=[] i=m j=n while i>0 and j>0: if s1[i-1]==s2[j-1]: res.append(s1[i-1]) i-=1 j-=1 elif dp[j-1][i]>dp[j][i-1]: j-=1 else: i-=1 return ''.join(reversed(res)) if res else '-1'

题目二:

给定两个字符串str1和str2,输出两个字符串的最长公共子串

题目保证str1和str2的最长公共子串存在且唯一。

数据范围: 1≤∣str1∣,∣str2∣≤50001≤∣str1∣,∣str2∣≤5000
要求: 空间复杂度 O(n2),时间复杂度 O(n2)


方法:

动态规划的方法和最长公共子序列相似,但是由于子序列和子串的特性不同,如果新遍历到的字符串对应位置的字符不相等,直接重置为0。不过动态规划的方法用python可能会出现超时的问题,所以可以考虑用滑动窗口的方法

代码:

class Solution: def LCS(self , str1: str, str2: str) -> str: # write code here if len(str1)<len(str2): str1,str2=str2,str1 # 将更长的字符串作为str1 maxlen=0 res='' for i in range(len(str1)): if str1[i-maxlen:i+1] in str2: # str1[0:0] 会返回一个空字符串 '' res=str1[i-maxlen:i+1] maxlen+=1 return res
http://www.jsqmd.com/news/1132082/

相关文章:

  • 真的领到了这张8元现金券
  • 2026 内容创作类 AI 赛道全新红利(分短视频、图文绘画、AI 音乐、通用自动化四大板块,全部是今年落地可变现风口)
  • OpenCode × DeepSeek 配置方案迭代记:砍砍补补,越来越好用
  • Ubuntu系统向日葵远程桌面配置指南
  • iNeuOS工业互联网操作系统
  • 大部分管理信息系统(MIS)都少不了员工
  • 昆仑芯的“第三条路”
  • Week7:卷积神经网络、深度网络原理与循环神经网络专题
  • Linux find 命令性能深度解析:对比 locate 与 fd 的 3 大场景实测
  • Unity AssetBundle 加密方案对比:3种主流方法性能开销与安全性实测
  • ChatModel 构建 LLM 驱动的 Java 应用
  • Edge/Chrome 开发者工具获取京东 Cookie:3 步定位 pt_key/pt_pin 的完整流程
  • 折腾了两周Codex,整理了一份从安装到实战的避坑指南
  • Agent Memory最新综述:长上下文和RAG之后,还缺什么?
  • 张家界口碑黄金铂金回收白银回收实体老店
  • C语言学习笔记20260705-基于栈的排列重排——求字典序最大的合法出栈序列
  • DB2 11.5 Windows 10 安装避坑 3 要点:家庭版系统安全性与驱动下载
  • 机器人产业演进逻辑与商业化落地全景攻略
  • 从演示到生产:AI 编程工具链在大模型应用落地中的工程化实践
  • 知识加工模块与博客工厂模块的状态重新定义
  • 一年之后,重新理解 AI 编程
  • 2026北京活动策划公司口碑榜与政企会务优选指南
  • SQL注入编码绕过技术详解:从URL编码到宽字节注入
  • 【嵌入式C语言】07.二级指针+函数
  • Unity UGUI ScrollRect 与 Mask 组合:5个高级交互效果实现(含惯性/回弹)
  • AI CLI 流式渲染:边输出边保存,别只顾炫酷
  • 第18周周报
  • 你的 AI Agent 会在服务器上“修仙“——OpenClaw.NET 长持久会话技术解读
  • x64dbg 逆向实战:3步定位小程序密码验证逻辑并绕过(附修改汇编指令)
  • 豆包和通义千问智能体突遭下线——AI拟人化监管正式落地,影响有多大?