[Python]获取2个字符串的最长公共子串



原创文章,欢迎转载。转载请注明:转载自 祥的博客

原文链接:https://blog.csdn.net/humanking7/article/details/84645055


1.问题引出

我下载了一些英语资料,这些资料的命名还好,但是就是没有用文件夹归档,整体感觉很乱,所以打算要将他们用文件夹分类。

计划是这样的:

  1. 查找所有pdfpdf名字创建文件夹,并将对应的pdf文件,移入文件夹中;
  2. 查找与pdf名字最接近的MP3文件,并将其移入对应的文件夹中。

看到明显是一本书的文本音频资料

  • 文本:黑猫英语名著3级 02 Alic's Adventures In Wonderland 艾丽丝漫游奇境记.pdf
  • 音频:艾丽丝漫游奇境记 Alic_s Adventures In Wonderland 01.mp3

可以发现,他们都有相同的子字符串 ,所以先要处理找两个字符串最长公共子串的问题

在这里插入图片描述

2. 源码及测试结果

2.1. 程序源码

def getMaxCommonSubstr(s1, s2):
# 求两个字符串的最长公共子串
# 思想:建立一个二维数组,保存连续位相同与否的状态

    len_s1 = len(s1)
    len_s2 = len(s2)

    # 生成0矩阵,为方便后续计算,多加了1行1列
    # 行: (len_s1+1)
    # 列: (len_s2+1)
    record = [[0 for i in range(len_s2+1)] for j in range(len_s1+1)]    
    
    maxNum = 0          # 最长匹配长度
    p = 0               # 字符串匹配的终止下标 

    for i in range(len_s1):
        for j in range(len_s2):
            if s1[i] == s2[j]:
                # 相同则累加
                record[i+1][j+1] = record[i][j] + 1
                
                if record[i+1][j+1] > maxNum:
                    maxNum = record[i+1][j+1]
                    p = i # 匹配到下标i

    # 返回 子串长度,子串
    return maxNum, s1[p+1-maxNum : p+1]



def printMatrixList(li):
# 打印多维list
    row = len(li)
    col = len(li[0])
    
    for i in range(row):
        for j in range(col):
            print(li[i][j], end=' ')
        print('')


    
    
if __name__ == "__main__":

    # s1="黑猫英语名著3级 02 Alic's Adventures In Wonderland 艾丽丝漫游奇境记.pdf"
    # s2="艾丽丝漫游奇境记 Alic_s Adventures In Wonderland 01.mp3"
    s1='abcdef'
    s2='bcxdef'
    [lenMatch,strMatch] = getMaxCommonSubstr(s1,s2)
    print('子串: ', strMatch)
    print('子串长度: ', lenMatch)

2.2. 测试结果

# 如果数据是`abcdef`等
子串:  def
子串长度:  3

# 如果数据是`艾丽丝`等
子串:  s Adventures In Wonderland
子串长度:  27

3. 分析

对于测试字符串为:

s1='abcdef'
s2='bcxdef'

明显看出有2个公共子串,bcdef,上述的方法就是用2个字符串各自的长度建立了一个矩阵,矩阵数值初始都是0,一个字符一个字符的进行对比,如果字符相等,就在左上对角线元素的数值上加一(如下面所示)。
假设字符串长度分别为nm,则创建这个矩阵的时候,算法复杂度为O(nm),查找最大子串的算法复杂度为O(nm),整体算法的复杂度为2O(nm)

理论上,可以把创建矩阵和查找放在一起,这样就会优化许多,等我闲了再搞吧,先完成主要目标。

0 b c x d e f
a 0 0 0 0 0 0
b 1 0 0 0 0 0
c 0 2 0 0 0 0
d 0 0 0 1 0 0
e 0 0 0 0 2 0
f 0 0 0 0 0 3

4. Next

最终不要忘了 初心
[Python]将MP3和PDF按名字分类归档到各自文件夹 : https://blog.csdn.net/humanking7/article/details/84663012


以上,Enjoy~


赞赏码New

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值