Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >[Python]获取2个字符串的最长公共子串

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

作者头像
祥知道
发布于 2020-03-10 07:57:11
发布于 2020-03-10 07:57:11
2.6K00
代码可运行
举报
文章被收录于专栏:祥的专栏祥的专栏
运行总次数:0
代码可运行

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

原文链接:https://cloud.tencent.com/developer/article/1596385


文章目录

代码语言:txt
AI代码解释
复制
- @[toc]1.问题引出源码及测试结果2.1. 程序源码2.2. 测试结果分析Next

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. 程序源码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def getMaxCommonSubstr(s1, s2):
# 求两个字符串的最长公共子串
# 思想:建立一个二维数组,保存连续位相同与否的状态

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

    # 生成0矩阵,为方便后续计算,多加了11列
    # 行: (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. 测试结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 如果数据是`abcdef`子串:  def
子串长度:  3

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

3. 分析

对于测试字符串为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s1='abcdef'
s2='bcxdef'

明显看出有2个公共子串,bcdef,上述的方法就是用2个字符串各自的长度建立了一个矩阵,矩阵数值初始都是0,一个字符一个字符的进行对比,如果字符相等,就在左上对角线元素的数值上加一(如下面所示)。

假设字符串长度分别为nm,则创建这个矩阵的时候,算法复杂度为O(nm),查找最大子串的算法复杂度为O(nm),整体算法的复杂度为2O(nm)

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[Python]将MP3和PDF按名字分类归档到各自文件夹
原文链接:https://blog.csdn.net/humanking7/article/details/84663012
祥知道
2020/03/10
9100
最长公共子串 / 子序列
本文记录寻找两个字符串最长公共子串和子序列的方法。 名词区别 最长公共子串(Longest Common Substring)与最长公共子序列(Longest Common Subsequence)的区别: 子串要求在原字符串中是连续的,而子序列则只需保持相对顺序,并不要求连续。 最长公共子串 是指两个字符串中最长连续相同的子串长度。 例如:str1=“1AB2345CD”,str2=”12345EF”,则str1,str2的最长公共子串为2345。 动态规划 如果 str1 的长度为
为为为什么
2022/08/10
4.6K0
最长公共子串 / 子序列
最长公共子序列与最长公共子串
举个例子:s1="abcfde",s2="bcde"。那么s1与s2的最长公共子序列就是"bcde",注意不要求连续。该问题是典型的动态规划问题。
Cyril-KI
2022/09/16
1K0
[1019]python实现求两个字符串的最长公共子串方法
参考:https://www.jb51.net/article/144122.htm
周小董
2021/07/14
9510
poj 1159 Palindrome(最长公共子串)
MaxLen(i, j) = 0 //两个空串的最长公共子序列长度当然是0
xindoo
2021/01/22
4290
poj 1159 Palindrome(最长公共子串)
[PHP]算法-最长公共子串的PHP实现
最长公共子串问题: 给定两个字符串,求出它们之间最长的相同子字符串的长度。 暴力解法思路: 1.以两个字符串的每个字符为开头,往后比较,这样就会需要两层循环 2.两层循环内部的比较方式,也是一层循环,以当前字符为起点,往后遍历比较,直到有不同就跳出这次循环,记录下相同子字符串的长度 3.以最长的那次长度为准,因此也就是有三层循环。时间复杂度O(n^3) longest=0 for i=0;i<str1.size;i++ for j=0;j<str2.size;j++ m=i n
唯一Chat
2019/09/10
4200
最长公共子串- LCS 算法
 LCS (Longest Common Subsequence) 算法 已知字符串str1="网站高并发解决方案",str2="如何解决网站高并发",如何字符串最长公共子串? lcs 算法原理
仙士可
2020/10/29
1.1K0
算法练习:动态规划(最长公共子串问题)
我们将两个字符串的字符逐一对比,然后将对比的结果(即如果相等,那么在原有的长度基础上加1)保存在数组中。因为要返回子串,因此需要拿到最长子串的起始位置和长度,长度保存在了数组中,起始位置我们通过计算得出来。请看下图:
二肥是只大懒蓝猫
2023/03/30
7080
算法练习:动态规划(最长公共子串问题)
算法学习之最长公共子串
最长公共字串,最长公共子序列,最长递增子序列都是典型的动态规划问题,最长公共子串和最长公共子序列的差别是最长公共子序列可以不连续,但是最长公共子串必须连续。先来看最长公共子串,首先会想到暴力法解决,最长公共子串的暴力法会达到指数级,所以我们直接用dp解决,先确定状态,由于最长公共子串必须是连续的,所以我们这个状态很好想出来,dp[i][j]代表字符串str1位置i之前和str2位置j之前公共子串多长,下面确定状态转移方程
用户4415180
2022/06/23
2350
golang刷leetcode动态规划(2)最长公共子串(子序列)
子串(Substring)是串的一个连续的部分,子序列(Subsequence)则是从不改变序列的顺序,而从序列中去掉任意的元素而获得的新序列;更简略地说,前者(子串)的字符的位置必须连续,后者(子序列LCS)则不必。比如字符串acdfg同akdfc的最长公共子串为df,而他们的最长公共子序列是adf。
golangLeetcode
2022/08/02
6110
最长公共子序列与最长公共子串
0. 引言 最近鄙人面试百度,出了这道求解公子序列长度的算法题。故此总结一下,这是一个很典型的题目,希望对大家将来的面试中能起到学习的作用。 1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与母串保持一致,我们将其称为公共子序列。最长公共子序列(Longest Common Subsequence,LCS),顾名思义,是指在所有的子序列中最长的那一个。子串
机器学习算法工程师
2018/03/06
1.1K0
最长公共子序列与最长公共子串
最长公共子串/序列问题
给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。
你的益达
2020/08/17
6530
最长公共子序列与最长公共子串(DP)
比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与母串保持一致,我们将其称为公共子序列。最长公共子序列(Longest Common Subsequence,LCS),顾名思义,是指在所有的子序列中最长的那一个。子串是要求更严格的一种子序列,要求在母串中连续地出现。在上述例子的中,最长公共子序列为blog(cnblogs,belong),最长公共子串为lo(cnblogs, belong)。
蛮三刀酱
2019/09/11
6070
LintCode 最长公共子串代码
给出两个字符串,找到最长公共子串,并返回其长度。 注意事项 子串的字符应该连续的出现在原字符串中,这与子序列有所不同。 样例 给出A=“ABCD”,B=“CBCE”,返回 2 代码 public class Solution { /** * @param A, B: Two string. * @return: the length of the longest common substring. */ public int longestCommonSubs
desperate633
2018/08/22
3280
LCS/最长公共子序列/最长公共子串 实现 Python/Java
http://blog.csdn.net/u012102306/article/details/53184446 http://blog.csdn.net/hrn1216/article/details/51534607
蛮三刀酱
2019/03/26
9940
LCS/最长公共子序列/最长公共子串 实现 Python/Java
最长公共子串
动态规划是大厂的热门考点,其中最长公共子串与最长公共子序列这两道题出现得尤其频繁,这两道题其实有挺多变种,很适合考察侯选人对动态规划的掌握情况,今天我们就先来看看如何求解最长公共子串,图文并茂,清晰易懂!
kunge
2020/09/22
2.7K0
<dp>求最长的公共子串
Given an unsorted array of integers, find the length of longest increasing subsequence.
大学里的混子
2018/11/18
9910
NLP笔记:浅谈字符串之间的距离
故事起源于工作的一个实际问题,要分析两个文本序列间的相似性,然后就想着干脆把一些常见的字符串相似性内容一并整理一下好了。
codename_cys
2021/03/25
1.5K0
Java2023算法面试题java,python,go
素数:一个大于1的正整数,如果除了1和它本身以外,不能被其他正整数整除,就叫素数。如2,3,5,7,11,13,17…
疯狂的KK
2023/04/24
1870
JavaScript求最大公共子串
对两个字符串的每一项都进行比较,若匹配则该项为1,不匹配则为0。然后求出对角线最长为1的那一段序列,即为最大公共子串。
meteoric
2019/02/25
9010
相关推荐
[Python]将MP3和PDF按名字分类归档到各自文件夹
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文