使用 python 实现动态规划之最长公共子串

动态规划经典问题 - 求最长公共子串 / 公共子序列 首先要理解公共子串和公共子序列 公共子串和公共子序列是两个不相同的概念, 公共子串要求字符连续, 公共子序列不要求字符连续。 比如: 字符串"ascde", “axcxdde” 最长公共子串是 “de” , 因为 "de"在两个字符串中都是连续的 最长公共子序列是 “acde”, 不要求连续, 只要满足两个字符串中子序列前后顺序的一致即可 动态规划求最长公共子序列 动态规划的核心是 base case 状态转移方程 自下而上 我们可以通过状态转移表来帮助我们得出状态转移方程 这里我直接说结论: 我们思考 阅读详情

这道题属于动态规划中十分经典的题目,在两个字符串中找到最长的公共子串,返回其最大长度或最大字符串。

一、解题思路

我们可以让两个字符串分别作为一个二维矩阵的行和列,然后比较二维矩阵中每个点对应的行列字符串中的字符是否相同,如果相同设置为1,否则设置为0。接着只需要查找值为1的最长对角线就可以解决。
对于以下两个字符串为例:

str1="asdfas"
str2="werasdfaswer"

在这里插入图片描述
可以发现,我们所找寻的公共子串就是图中的几条对角线,而长的公共子串就是对角线最长的那一个。

二、动态规划

动态规划的核心就是如何转移,如何利用上一步的结果,根据当前的条件判断,得出现在状态的结果:
在这里插入图片描述

record[i][j]=1可以演变为record[i][j]=1+record[i-1][j-1]

三、函数实现输出最长公共子串长度

def lcs_max_num(str1, str2):
    m = len(str1)
    n = len(str2)
    max_num = 0
    # 构造一个(m+1)*(n+1)的二维数组来存储LCS的长度
    lcs_len = [[0] * (n + 1) for i in range(m + 1)]

    # 动态规划求解LCS的长度
    for i in range(1, m + 1):
        for j in range(1, n + 1):
            if str1[i - 1] == str2[j - 1]:
                lcs_len[i][j] = lcs_len[i - 1][j - 1] + 1
            if max_num < lcs_len[i][j]:
                max_num = lcs_len[i][j]
    return max_num

if __name__ == "__main__":
    str1 = 'asdfas'
    str2 = 'werasdfaswer'
    print(lcs_max_num(str1, str2))

四、函数实现输出最长公共子串

def lcs_max_char(str1, str2):
    m = len(str1)
    n = len(str2)
    # 构造一个(m+1)*(n+1)的二维数组来存储LCS的长度
    lcs_len = [[0] * (n + 1) for i in range(m + 1)]

    # 动态规划求解LCS的长度
    for i in range(1, m + 1):
        for j in range(1, n + 1):
            if str1[i - 1] == str2[j - 1]:
                lcs_len[i][j] = lcs_len[i - 1][j - 1] + 1
            else:
                lcs_len[i][j] = max(lcs_len[i - 1][j], lcs_len[i][j - 1])

    # 根据LCS的长度求解LCS的文本
    lcs_text = ""
    i = m
    j = n
    while i > 0 and j > 0:
        if str1[i - 1] == str2[j - 1]:
            lcs_text = str1[i - 1] + lcs_text
            i -= 1
            j -= 1
        elif lcs_len[i - 1][j] > lcs_len[i][j - 1]:
            i -= 1
        else:
            j -= 1

    return lcs_text

if __name__ == "__main__":
    str1 = 'asdfas'
    str2 = 'werasdfaswer'
    print(lcs_max_char(str1, str2))
Python编码---2个字符串寻找最长子字符串 String:字符串是由数字、字母、下划线等组成的一串字符。字符串的有关操作,各个大厂笔试、面试高频问题,如输入2个字符串,求2个字符串的最长公共字符串。本文用Python语言实现2个字符串S1、S2中寻找最长公共字符串(长度相等,都打印)。 阅读详情

相关推荐

牛客网NC127 最长公共子串python解析

描述 给定两个字符串str1和str2,输出两个字符串的最长公共子串 题目保证str1和str2的最长公共子串存在且唯一。 示例1 输入: "abc1234321ab",12 复制返回值: 7 解题思路: 动态规划: 思路一,dp[i][j]代表最大字符串长度,定义时建立为数字的矩阵,通过索引切片得出公共子串 dp[i][j]表示字符串str1中第i个字符和str2种第j个字符为最后一个元素所构成的最长公共子串。如果要求dp[i][j],也就是str1的第i个字符和str2的第j

m0_60968284的博客 322

数据结构与算法之最长公共子串

最长公共子串问题是指给定两个字符串S1和S2,求它们的公共子串中最长的那一个。其实就是求两个字符串的最长重复子串。最朴素的算法就是枚举S1和S2的每一对子串,然后判断它们是否相等,时间复杂度是O(n^3)。但是这种算法效率太低,无法满足实际需求。一般采用动态规划的思想进行求解,令dp[i][j]表示以S1的前i个字符和S2的前j个字符为结尾的公共子串的长度,当S1[i]=S2[j]时,dp[i][j]=dp[i-1][j-1]+1;否则dp[i][j]=0。最后找出dp[i][j]的最大值即可。

weixin_47225948的博客 4925

最长公共子串(动态规划)

来源:https://www.cnblogs.com/fanguangdexiaoyuer/p/11281179.html1 描述 有两个字符串(可能包含空格),请找出其中最长的公共连续...

编程与实战的博客 2258

最长公共子串

最长公共子串

weixin_53235736的博客 3980

GPU八卡A100使用INT4-W4A16量化大模型实验

本实验旨在探索在环境下,对大语言模型进行权重量化的可行性、效率与性能影响。通过采用工具集成 GPTQ 算法,实现对所有线性层的权重量化(W4A16 方案最终通过lm-eval工具在GSM8K任务上对压缩模型进行评估。

goodgood_UP的博客 1909

Voicebox本地部署:模型下载与离线模式实战指南

在本地语音处理场景中,模型下载失败和离线运行需求是开发者最常遇到的两大难题。理解语音工具的本地推理原理,关键在于掌握模型文件与程序逻辑的分离管理:模型独立下载,程序负责推理,输出留在本机。这种架构带来显著的技术价值——数据不出本地、不依赖公网、批量任务不中断。无论是语音识别转写、语音合成,还是集成到自动化脚本中,本地离线模式都能在隐私敏感或网络不稳定环境下稳定运行。对开发者而言,先解决模型文件的完整获取,再验证离线启动流程,就能绕过“无法下载模型”的常见坑。本文从环境准备、模型放置、服务启动到接口调用,提供

weixin_29048309的博客 310

LCS(最长公共子串) python3实现

LCS问题就是求两个字符串最大相同的公共子串;我们现假设有两个字符串X,Y。其长度分别为m,n 我们从X,Y两个字符串的最后一个字符串开始看起 如果 Xm = Yn: LCS(X, Y) = LCS(Xm-1, Yn-1)+ "Xm" 如果Xm != Yn: LCS(X,Y) = max(LCS(Xm-1,Yn), LCS(Xm, Yn-1)) 我们即构建了这样的动态转移方程。如果...

爱发呆的小小曹 3928

XGBoost详解(原理篇)

XGBoost全称为eXtreme Gradient Boosting,即极致梯度提升树。XGBoost是Boosting算法的其中一种,Boosting算法的思想是将许多弱分类器集成在一起,形成一个强分类器(个体学习器间存在强依赖关系,必须串行生成的序列化方法)。Note:关于Boosting算法详见博文集成学习详解_tt丫的博客-优快云博客XGBoost是一种提升树模型,即它将许多树模型集成在一起,形成一个很强的分类器。其中所用到的树模型则是CART回归树模型。

tt丫的博客 7万+

最长公共子序列和最长公共子串动态规划实现(c++)

最长公共子序列和最长公共子串动态规划实现(c++) 参考:乖乖的函数 1 最长公共子序列 定义: 字符串s=“heqlloled”,字符串p=“eolold!”. swp[i][j]表示s[0,…i]与p[0,…j]的最长公共子序列长度. 状态转移方程: (1) 当s[i]==p[j]时,swp[i][j]=swp[i-1][j-1]+1; (2) 当s[i]!=p[j]时,swp[i][j]=m...

qq_42160588的博客 1202

AUTOSAR Dem模块实战配置:从理论到代码生成的完整指南

本文提供了一份AUTOSAR Dem模块从理论到代码生成的完整实战配置指南。文章详细拆解了配置流程,涵盖Dem模块的核心角色、通用骨架搭建、事件与DTC映射、消抖机制配置,以及与BswM、EcuM、DCM等模块的联调方法,旨在帮助汽车电子工程师快速掌握诊断事件管理的关键配置步骤,生成可运行的代码。

3c4x5z6v7b的博客 455

大模型呼叫中心场景分享之六:大模型外呼IT运维告警——智能监控与自动化响应的未来

在数字化运维(IT Operations)中,实时监控系统健康状态并及时响应告警是保障业务连续性的关键。传统的IT告警方式(如邮件、短信、钉钉/企业微信通知)存在信息过载、响应延迟、人工处理效率低等问题。而大模型(LLM)与语音技术(TTS/ASR)的结合,为IT运维告警提供了更智能的解决方案——大模型外呼告警系统。大模型外呼告警系统正在重新定义IT运维的效率和体验。通过实时语音交互+智能自动化,企业能够将平均故障修复时间(MTTR)从小时级缩短至分钟级。

开源呼叫中心系统FreeIPCC的博客 924

求最长非连续公共子串算法LCS

python 求最长非连续公共子串算法LCS 动态规划求最长非连续公共子串算法LCS参照算法网址:http://blog.chinaunix.net/u1/35100/showart_415862.html入口: 两个 要比较的串 S1,S2返回 : 最长非连续公共子串 S #coding=gbk # class TEMT: L,IX1,IX2 =0,0,0 def W...

dqf88的专栏 239

论文必备 - YOLOv11热力图可视化,支持指定模型,指定显示层,设置置信度,以及10种可视化实现方式

本文带来的是YOLOv11热力图可视化功能,支持,以及。我们经常看到一些论文里绘制了不同的热力图,一方面能够直观的感受其模型的有效性,另一方面也丰富了论文内容。特别是在使用了注意力模块的网络中,热力图就可以验证注意力机制是否真正聚焦到了预期的重要特征上,以便对模型的有效性和合理性进行评估。例如这篇文章中展示的,就很能够表达作者改进后的模型相比之前模型的优越性。

Limiiiing的博客 5505

最长公共子串问题

最长公共子串问题 给出两个字符串,问如何求出这两个字符串的公共子串长度以及公共子串是什么。(还有一个类似的问题是两字符串的公共子序列,有待分析)。 例子: INPUT: abcdefg gdefacd OUTPUT: 3 def 动态规划法 使用动态规划法,相当于用空间换时间。 将一个复杂的大问题,分解为较为简单的子问题,最重要的步骤就是推导状态转移公式。 现有两个字符串,X=(x1, x2,...

imYYCCC的博客 320

Codex 100个真实案例 - 全系列总结与Codex最佳实践全解析

历经100个案例的淬炼,我们终于来到了终点!本篇是整个系列的压轴之作——全面回顾100个案例的分类统计、提炼Codex使用的核心技巧和最佳实践、总结Prompt工程的精华要点、剖析常见错误及解决方案、展望AI编程的未来趋势,并为不同水平的读者规划学习路径。这不仅是一篇总结,更是一本Codex实战手册!

yueyeguzhuo的专栏 136

大模型应用开发 100 天:Python + LLM 从入门到精通 day01~环境搭建与开发工具

Day 1 正式开启《大模型应用开发 100 天》实战旅程。本文聚焦 AI 开发最容易被忽视却至关重要的环境搭建环节,系统讲解基于 pyenv、uv、VS Code 构建一套可复现、项目隔离的标准化 Python 开发工具链。你将掌握多 Python 版本管理、极速依赖安装、虚拟环境隔离、代码规范配置完整流程,配套可直接运行的环境校验脚本与 Mermaid 架构图,规避版本冲突、环境污染等高频踩坑问题,为后续 99 天 LLM 项目开发筑牢底层基础。来自华北理工大学段一凡的博客文章

段一凡的博客 247

Python 实现最长公共子串&最长公共子序列(LCS)

最长公共子串 (The Longest Common Substring) 参考自:https://blog.youkuaiyun.com/wateryouyo/article/details/50917812 LCS问题就是求两个字符串最长公共子串的问题。解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1的序列,其对应的位置就是最长匹配...

zwglory的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

使用Python3得到两个字符串的最长公共子序列

使用Python3得到两个字符串的最长公共子序列 使用动态规划的方法

诸神缄默不语的博客 1564

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

最长公共子串 和 最长公共子序列 的python算法实现

《算法图解》第9章 动态规划 后面给出了怎么求两个字符串的 最长公共字串 和 最长公共子序列 的算法思路。但是没有给出代码实现,这里根据其思路实现其算法python编程。 最长公共字串 为两个字符串a, b中相同的连续字符串的长度。 如 a=‘yhabcfdaefch’ , b=‘abcfaaegh’ 则a,b的最长公共子串为’abcf’ 思路如下: 代码如下: import numpy ...

fzl的博客 872

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

*65 /70 查找两个字符串a,b中的最长公共子串

题目描述 查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。 输入描述: 输入两个字符串 输出描述: 返回重复出现的字符 示例1 输入 abcdefghijklmnop abcsafjklmnopqrstuvw 输出 jklmnop while True: try: str1=input() str2=input() ...

wenlyq的博客 228

NC127-最长公共子串-【动态规划】

一、题目 给定两个字符串str1和str2,输出两个字符串的最长公共子串,如果最长公共子串为空,输出-1。 示例1 "1AB2345CD","12345EF" 返回: "2345" 二、题解 哔站动态规划思路详细讲解 class Solution { public: /** * longest common substring * @param str1 string字符串 the string * @param str2 string字

菜鸟学编程 317

动态规划——最长公共子串

def find_lcsubstr(s1, s2): # dp矩阵 m = [[0]*len(s2) for j in range(len(s1))] # 记录最大的公共子串长度 nmax = 0 # 记录最大的公共子串长度的结尾索引 p = 0 for i in range(len(s1)-1): for j in range(len(s2)-1): if s1[i] == s2[j]: .

qq_36950604的博客 172

数据结构与算法:动态规划计算最长公共子串

#!/usr/bin/python3 # -*- coding:utf-8 -*- """ @Author : heyw @Contact : he_yuanwen@126.com @Time : 2020/2/28 21:08 @Software: PyCharm @FileName: max_len_common_sub_str.py """ def max_len_common_...

u010404548的博客 323

求最长公共子串长度与最长公共子串问题/求最长公共子序列长度与最长公共子序列问题

import numpy as np str1 = 'abaccb' str2 = 'aaccab' tmp_str1 = str1 tmp_str2 = str2 str1 = '0' + str1 str2 = '0' + str2 len1 = len(str1) len2 = len(str2) dp = np.zeros((len1, len2), dtype=np.int) for i in range(1, len1): for j in range(1, len2):

m0_46689661的博客 239

python 最长公共子序列长度_详解Python最长公共子串和最长公共子序列的实现

最长公共子串(The Longest Common Substring)LCS问题就是求两个字符串最长公共子串的问题。解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1的序列,其对应的位置就是最长匹配子串的位置。def find_lcsubstr(s1, s2):m=[[0 for i in range(len(s2)+1)] f...

weixin_39558391的博客 137

递归与动态规划---最长公共子串问题

问题:   给定两个字符串str1和str2,返回两个字符串的最长公共子串。举例:   str1 = “1AB2345CD”,str2 = “12345EF”,返回”2345”。基本思路: 假设str1的长度为N,str2的长度为M,生成N×M的矩阵dp,dp[i][j]的含义是必须以str1[i]和str2[j]结尾的最长公共子串的长度,dp[i][j]的计算方法如下: 矩阵的第一行。如果s

冰殇的博客 1649
上一篇: 模型部署之TorchScript
下一篇: Python 的垃圾回收机制(GC-GarbageCollection)
TFATS-AI
博客等级 码龄7年 1279粉丝 172原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值