LCS/最长公共子序列/最长公共子串 实现 Python/Java
参考
http://blog.csdn.net/u012102306/article/details/53184446
http://blog.csdn.net/hrn1216/article/details/51534607
最长公共子序列LCS
动态规划状态转移方程式
Python
递归
def LCS(a, b):if a == '' or b == '':return ''elif a[-1] == b[-1]:return LCS(a[:-1], b[:-1]) + a[-1]else:sol_a = LCS(a[:-1], b)sol_b = LCS(a, b[:-1])if len(sol_a) > len(sol_b):return sol_areturn sol_bif __name__ == "__main__":a = 'abc'print(a[::-1])print(LCS(a,a[::-1]))
动态规划
DP矩阵,前面多一行一列0,因为第一排计算需要用到dp[i - 1][j], dp[i][j -1]
之前的代码是多出了直接填写第二行第二列为1,但是也可以没必要,添加的可以参考Java版本的。
def lcs_dp(input_x, input_y):# input_y as column, input_x as rowdp = [([0] * (len(input_y)+1)) for i in range(len(input_x)+1)]for i in range(1, len(input_x)+1):for j in range(1, len(input_y)+1):if input_x[i-1] == input_y[j-1]: # 相等就加一dp[i][j] = dp[i - 1][j - 1] + 1else: # 不相等dp[i][j] = max(dp[i - 1][j], dp[i][j -1])for dp_line in dp:print(dp_line)return dp[-1][-1]print(lcs_dp('saibh','sibh'))
[0, 0, 0, 0, 0]
[0, 1, 1, 1, 1]
[0, 1, 1, 1, 1]
[0, 1, 2, 2, 2]
[0, 1, 2, 3, 3]
[0, 1, 2, 3, 4]
4
Java
动态规划
public static int lcs(String str1, String str2) { int len1 = str1.length(); int len2 = str2.length(); int c[][] = new int[len1+1][len2+1]; for (int i = 0; i <= len1; i++) { for( int j = 0; j <= len2; j++) { if(i == 0 || j == 0) { c[i][j] = 0; } else if (str1.charAt(i-1) == str2.charAt(j-1)) { c[i][j] = c[i-1][j-1] + 1; } else { c[i][j] = max(c[i - 1][j], c[i][j - 1]); } } } return c[len1][len2];
}
最长公共回文子串
动态规划状态转移方程式
Python
动态规划
同上面相同:
if i == 0 or j == 0: # 在边界上,自行+1dp[i][j] = 0
这句话可以省略,因为可以在循环钟推导出。
同时输出长度和字符串
class LCS3:def lcs3_dp(self, input_x, input_y):# input_y as column, input_x as rowdp = [([0] * (len(input_y)+1)) for i in range(len(input_x)+1)]maxlen = maxindex = 0for i in range(1, len(input_x)+1):for j in range(1, len(input_y)+1):if input_x[i-1] == input_y[j-1]:dp[i][j] = dp[i - 1][j - 1] + 1if dp[i][j] > maxlen: # 随时更新最长长度和长度开始的位置maxlen = dp[i][j]maxindex = i - maxlen# print('最长公共子串的长度是:%s' % maxlen)# print('最长公共子串是:%s' % input_x[maxindex:maxindex + maxlen])else:dp[i][j] = 0for dp_line in dp:print(dp_line)return maxlen, input_x[maxindex:maxindex + maxlen]if __name__ == '__main__':lcs3 = LCS3()print(lcs3.lcs_dp('cabdec','cbdec'))
运行结果
[1, 0, 0, 0, 1]
[0, 0, 0, 0, 0]
[0, 1, 0, 0, 0]
[0, 0, 2, 0, 0]
[0, 0, 0, 3, 0]
[1, 0, 0, 0, 4]
bdec
Java
动态规划(懒得加上返回字符串了)
public static int lcs3(String str1, String str2) { int len1 = str1.length(); int len2 = str2.length(); int result = 0; //记录最长公共子串长度 int c[][] = new int[len1+1][len2+1]; for (int i = 0; i <= len1; i++) { for( int j = 0; j <= len2; j++) { if(i == 0 || j == 0) { c[i][j] = 0; } else if (str1.charAt(i-1) == str2.charAt(j-1)) { c[i][j] = c[i-1][j-1] + 1; result = max(c[i][j], result); } else { c[i][j] = 0; } } } return result; }
LCS/最长公共子序列/最长公共子串 实现 Python/Java相关推荐
- 动态规划算法之:最长公共子序列 最长公共子串(LCS)
1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...
- 算法设计 - LCS 最长公共子序列最长公共子串 LIS 最长递增子序列
出处 http://segmentfault.com/blog/exploring/ 本章讲解: 1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度: 2. 与之类似但不 ...
- 最长公共子序列算法 java_转【算法之动态规划(三)】动态规划算法之:最长公共子序列 最长公共子串(LCS)字符串相似度算法...
1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...
- 数据结构 - 字符串 - 最长公共子序列 + 最长公共子字符串 - 动态规划
最长公共子序列 /*** 最长公共子序列* 参考链接:http://blog.csdn.net/biangren/article/details/8038605* Created by 18710 o ...
- 最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和...
最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和 文章作者:Yx.Ac 文章来源:勇幸|Thinking (http://www.ahathi ...
- 最短公共子序列_最短公共超序列
最短公共子序列 Problem statement: 问题陈述: Given two strings, you have to find the shortest common super seque ...
- java实现最长连续子序列_最长公共子序列/最长公共子串 Python/Java实现
关注我的微信公众号:后端技术漫谈 不定期推送关于后端开发.爬虫.算法题.数据结构方面的原创技术文章,以及生活中的逸闻趣事. 我目前是一名后端开发工程师.主要关注后端开发,数据安全,网络爬虫,物联网,边 ...
- 动态规划之最长递增子序列 最长不重复子串 最长公共子序列
[前言]动态规划:与分治法相似,即通过组合子问题来求解原问题,不同的是分治法是将问题划分为互不相交的子问题,递归求解子问题,再将他们组合起来求出原问题的解. 动态规划则应用于子问题重叠的情况,通常用来 ...
- 动态规划-最长公共子序列-最长递增子序列-最大递增子序列和-miking time
1. 最长公共子序列 假设 X 和 Y 的序列如下: X[1...m] = {A, B, C, B, D, A, B} Y[1...n] = {B, D, C, A, B, A} 可以看出,X 和 Y ...
最新文章
- 服务被干爆了!竟然是日志的锅!!
- 微信小游戏开发教程-新建项目
- C# 基础知识 (三).主子对话框数值传递
- 该伙伴事务管理器已经禁止了它对远程/网络事务的支持
- mysql bin 恢复工具_基于binlog恢复工具mysqlbinlog_flashback
- 如何在 Mac 上使用“接力”回到上次离开的地方?
- tensorflow中获取shape的方法比较
- 68.vivado与modelsim的关联以及器件库编译
- Python批量压缩图片(TinyPNG)
- 蜗牛连珠五子棋改进版
- O'Stolz 定理及其应用
- 如何群发邮件?教你发邮件时文件怎么命名、如何设置邮件格式,一文解决你的疑惑
- 无法在未启用宏的工作薄
- tensorflow学习笔记——获取训练数据集和测试数据集
- dad my_【玩转英文绘本】My Dad!《我爸爸》
- 搭建Vulhub靶场 【附图】
- 开发一个电商网站大概多少钱
- vue中使用电子签名
- 物联网开发之esp8266连接onenet控制板载小灯(二)
- 关于尔雅平台通识课《创业创新执行力》的考试方法与考试须知
热门文章
- KUDU(二)kudu架构设计
- 【Easy Python】第四话:爬虫初探——玩转豆瓣二百五(下)
- spring @Autowire 的注解默认是按类型注入bean
- 如何查看Android手机CPU类型是armeabi,armeabi-v7a,还是arm64-v8a?
- 从炉石传说卡组推荐理解ASO搜索优化,aso搜索优化怎么用
- 从这里可以看到存储过程被 修改的时间 嘎嘎嘎
- python怎么输出1到100的数字集合_python 如何将一系列数字十个一行输出
- TZC 初中信息技术(python)题单————题解
- axios中params和data的区别
- c语言散列表的构造和查找,简单的哈希表实现 C语言