python练习 ---求2个字符串的最长公共子串的三种求解方法

本文探讨了求解两个字符串的最长公共子串的三种方法:直接查找、动态规划以及一种变形方法。对于直接查找,文章提出优化策略减少比较次数;动态规划方法通过构建矩阵记录相同字符的连续出现。然而,当有多个相同最长子串时,该方法可能返回最后一个。最后,文章提及了一个变形方法作为补充。
摘要由CSDN通过智能技术生成

求2个字符串的最长公共子串

最长公共子串(LCS,Longest Common Substring)
思考:
s1 = ‘abcdefg’
s2 = ‘defabcd’

方法一: 直接查找

思路:

最长公共子串一定出现在短的那个字符串里,如果用短的字符串中,先从最长字符开始,逐次减一,到长的那一个字符串中进行匹配.如果存在则说明已经找到,程序结束.

优化:

其实只要找到第一轮的公共子串的索引,最长公共子串也是从它开始的,所以以后的轮次都从这些索引位置开始,
可以减少比较的次数。

str1 = 'abcdefgg好好学习denf'
str2 = 'denf好好学习abcd'
import re 
def str_int(s1,s2):
    if len(s1) > len(s2):
        s1,s2 = s2,s1
        print(s1,s2)
    length = len(s1)
    result = []
    for step in range(length,0 ,-1):
        for start in range(0,length-step+1):
            flag = True
            tmp = s1[start:start+step]
            if s2.find(tmp)>-1 :# 第一次找到,后面要接着找 
                result.append(
  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值