python练习12)——最长公共子串

本文介绍几种寻找两个字符串之间的最长公共子串的方法,包括通过直接比较、子串集合交集、针对最短字符串查找以及使用矩阵法等。这些算法适用于字符串匹配与分析任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# 两个字符串相对而行,取重合部分看重复情况
# start:
# s1 aaaaaaaa
# s2        bbbbbbbb
# end:
# s1        aaaaaaaa
# s2 bbbbbbbb
def taiLongestSubstring(s1, s2):
    """连个字符串左对齐,取最长的公共子串,子串索引也相同"""
    if len(s1) > len(s2):
        s1, s2 = s2, s1                # aaaaaa
    count = 0                          # bbbbbbbbb
    maxcount = 0
    maxindex = 0
    for i in range(len(s1)):
        if s1[i] == s2[i]:
            count += 1
        else:
            if count > maxcount:
                maxcount = count
                maxindex = i-1
            count = 0
    else:
        if count > maxcount:
            maxcount = count
            maxindex = i
    return s1[maxindex-maxcount+1:maxindex+1]
def comLongestSubstring(s1, s2):
    tmp = ''
    subs = ''
    for i in range(len(s1)):
        tmp = taiLongestSubstring(s1[-i-1:], s2)
        if len(subs) < len(tmp):
            subs = tmp
    for j in range(1,len(s2)):
        tmp = taiLongestSubstring(s1, s2[j:])
        if len(subs) < len(tmp):
            subs = tmp
    return subs


# 所有子串集合取交集
def setSubstring(s):
    set1 = set()
    for i in range(1, len(s)+1):
        for j in range(0, len(s)-i+1):
            set1.add(s[j:j+i])
    return set1
def setLongestSubstring(s1,s2):
    longestSub = ''
    for i in setSubstring(s1) & setSubstring(s2):
        if len(i) > len(longestSub):
            longestSub = i
    return longestSub


# 类似上一个,拿最短字符串里的最长子串,在另一个字符串中查找
def LongestSubstring2(s1, s2):
    if len(s1) > len(s2):
        s1, s2 = s2, s1
    for i in range(len(s1), 0, -1):
        for j in range(0, len(s1) - i + 1):
            subs = s1[j:j + i]
            if s2.find(subs) != -1:
                return subs
    else:
        return ''


# 矩阵法,那s2中的每一个元素和s1比较,将比较结果记录在矩阵中,
# 不同记为0,相同在左上位置的基础上加1,记录最长子串长度及其索引
def LongestSubstring3(s1,s2):
    metrix = []
    count = 0
    maxindex = 0
    for i, x in enumerate(s2):
        metrix.append([])
        for j, y in enumerate(s1):
            if x != y:
                metrix[i].append(0)
            else:
                if i == 0 or j == 0:
                    metrix[i].append(1)
                else:
                    metrix[i].append(metrix[i-1][j-1] + 1)
                if count < metrix[i][j]:
                    count = metrix[i][j]
                    maxindex = j
    return s1[maxindex+1-count:maxindex+1]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值