[Python]获取2个字符串的最长公共子串
原创文章,欢迎转载。转载请注明:转载自 祥的博客
原文链接:https://blog.csdn.net/humanking7/article/details/84645055
文章目录
- @[toc]
- 1.问题引出
- 2. 源码及测试结果
- 2.1. 程序源码
- 2.2. 测试结果
- 3. 分析
- 4. Next
1.问题引出
我下载了一些英语资料,这些资料的命名还好,但是就是没有用文件夹归档,整体感觉很乱,所以打算要将他们用文件夹分类。
计划是这样的:
- 查找所有
pdf
用pdf名字
创建文件夹,并将对应的pdf
文件,移入文件夹
中; - 查找与
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] + 1if 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):
# 打印多维listrow = 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
个公共子串,bc
和def
,上述的方法就是用2个字符串
各自的长度建立了一个矩阵,矩阵数值初始都是0
,一个字符一个字符的进行对比,如果字符相等
,就在左上对角线元素的数值上加一
(如下面所示)。
假设字符串长度分别为n
和m
,则创建这个矩阵的时候,算法复杂度为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~
[Python]获取2个字符串的最长公共子串相关推荐
- Python —— 查询两个字符串的最长公共子串
查询两个字符串的最长公共子串 查询两个字符串的最长公共子串 查询两个字符串的最长公共子串 思路: 1.通过字符串1从全长开始判断是否存在于字符串2中,如果不存在则迭代至只有1位字符 2.通过列表来保存 ...
- php两个字符串公共,C++_C语言求两个字符串的最长公共子串,本文实例讲述了C语言求两个字 - phpStudy...
C语言求两个字符串的最长公共子串 本文实例讲述了C语言求两个字符串的最长公共子串的方法.分享给大家供大家参考.具体实现方法如下: #include "stdio.h" #inclu ...
- 求两个字符串的最长公共子串
给出两个字符串,求出两个字符串的最长公共子串 #include<iostream> #include<string> using namespace std; int main ...
- 两个字符串的最长公共子序列长度_输出两个字符串的最长公共子串和最长公共子序列...
输出两个字符串的最长公共子串和最长公共子序列.求解两个字符串的最长公共子串和最长公共子序列在方法上很接近,都是动态规划.只不过在递推方程上有一些不一样. 求两个字符串的最长公共子串 #include ...
- 找出两个字符串的最长公共子串
题目: 给定两个字符串str1和str2,输出两个字符串的最长公共子串,如果最长公共子串为空,输出-1. 输入描述: 输入包括两行,第一行代表字符串srr1,第二行代表字符串str2. 1 ≤ len ...
- DP之钢管切割,最长回文字符串,最长公共子串
在做LeetCode第3题的时候,用到了DP,但是自己对DP还是不了解,所以翻开算法导论,开始看动态规划喽,学好动态规划,走遍天下都不怕. 钢管切割 对于一根长n米的钢管,每个长度的价格不一样,对于长 ...
- 面试宝典_Python.常规算法.0002.输出任意两个字符串中最长公共子串?
面试题目: 1. 用PY实现求任意两个字符串最长的公共子串? 解题思路: 1. 先求出长度最小的字符串,然后遍历其索引,这样可以避免字符串索引溢出,然后判断对应索引的值是否相同,相同的话就加到目标字典 ...
- python【数据结构与算法】最长公共子串详解(附代码)
文章目录 1 定义 1 定义 和最长公共子序列一样,使用动态规划的算法. 下一步就要找到状态之间的转换方程. 和LCS问题唯一不同的地方在于当A[i] != B[j]时,res[i][j]就直接等于0 ...
- 最长公共子串_两个字符串的最长公共子串(后缀自动机)
// 最长公共子序列(后缀自动机) typedef struct state {int len, link;map<char, int> next; }state;const int MA ...
最新文章
- 前端面试题目及答案(欢迎拍砖)
- python猜数游戏在程序中预设一个_一道Python简单程序结构练习题
- (数据结构与算法)递归及一些经典递归问题
- 关于“无法完成该动作 到Microsoft Exchange的连接不可用”的解决办法
- SQL Server数据库索引的基础知识
- 关于无法加载已创建的布局文件的问题的解决方案以及已布局在对应的R文件中未生成相应ID的问题的解决
- B端页面——详细表单设计流程
- mysql定时器 教程_mysql定时任务
- python 多进程multiprocessing 模块
- 大白话说说 朴素贝叶斯
- 适合户外显示中玩耍的游戏
- 微信登录界面安卓代码_安卓Activity劫持与反劫持
- Solaris系统环境变量声明方法
- 乒乓球十一分制比赛规则_乒乓球比赛规则完整版
- ASP.NET动态网站开发培训-39.互动论坛制作(七、制作回复留言页面)
- CF卡插到时显示函数不正确请问咋才能修复?
- OMAP3530资料
- MySQL索引、事务与引擎基础详解,理论加实例
- python大数据作业-客户价值分析-实训头歌
- 工控机常见问题与解决方法