dp(动态规划)思考

本文详细介绍了如何使用动态规划(DP)解决字符串最大公共子串问题,通过实例展示了如何构建状态转移方程并利用表存储技巧避免重复计算,以提高算法效率。以 'sdakfhdfdasfdsafdsaakjhfabcaaa' 和 'fdafdsafdasfewafew' 为例,演示了如何找到最长公共子串及其长度。

dp的核心思想是分治策略和表存储。
分治策略并非dp所独有,很多算法都运用了把问题拆解为子问题的做法,比如递归。
表存储应该是dp比较独有的一种方式,通过存储一些中间结果,可以避免重复计算,从而提升程序运行的速度。

def max_length(s1,s2):
    # 最大公共子串,用dp求解
    max_len,max_str=0,''
    # 初始化矩阵
    res=[[0 for j in range(len(s2))] for i in range(len(s1))]
    # dp
    for i in range(len(s1)):
        for j in range(len(s2)):
            if s1[i]==s2[j]:
                # 首行或者首列单独处理
                if i==0 or j==0:
                    res[i][j]=1
                else:
                    res[i][j]=res[i-1][j-1]+1
                if max_len<res[i][j]:
                    max_len=res[i][j]
                    max_str=s1[i+1-max_len:i+1]
    # 返回最终结果
    return max_str,max_len

s1,s2='sdakfhdfdasfdsafdsaakjhfabcaaa','fdafdsafdasfewafew'
max_length(s1,s2)
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值