参考

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相关推荐

  1. 动态规划算法之:最长公共子序列 最长公共子串(LCS)

    1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...

  2. 算法设计 - LCS 最长公共子序列最长公共子串 LIS 最长递增子序列

    出处 http://segmentfault.com/blog/exploring/ 本章讲解: 1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度: 2. 与之类似但不 ...

  3. 最长公共子序列算法 java_转【算法之动态规划(三)】动态规划算法之:最长公共子序列 最长公共子串(LCS)字符串相似度算法...

    1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...

  4. 数据结构 - 字符串 - 最长公共子序列 + 最长公共子字符串 - 动态规划

    最长公共子序列 /*** 最长公共子序列* 参考链接:http://blog.csdn.net/biangren/article/details/8038605* Created by 18710 o ...

  5. 最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和...

    最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和 文章作者:Yx.Ac   文章来源:勇幸|Thinking (http://www.ahathi ...

  6. 最短公共子序列_最短公共超序列

    最短公共子序列 Problem statement: 问题陈述: Given two strings, you have to find the shortest common super seque ...

  7. java实现最长连续子序列_最长公共子序列/最长公共子串 Python/Java实现

    关注我的微信公众号:后端技术漫谈 不定期推送关于后端开发.爬虫.算法题.数据结构方面的原创技术文章,以及生活中的逸闻趣事. 我目前是一名后端开发工程师.主要关注后端开发,数据安全,网络爬虫,物联网,边 ...

  8. 动态规划之最长递增子序列 最长不重复子串 最长公共子序列

    [前言]动态规划:与分治法相似,即通过组合子问题来求解原问题,不同的是分治法是将问题划分为互不相交的子问题,递归求解子问题,再将他们组合起来求出原问题的解. 动态规划则应用于子问题重叠的情况,通常用来 ...

  9. 动态规划-最长公共子序列-最长递增子序列-最大递增子序列和-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 ...

最新文章

  1. 服务被干爆了!竟然是日志的锅!!
  2. 微信小游戏开发教程-新建项目
  3. C# 基础知识 (三).主子对话框数值传递
  4. 该伙伴事务管理器已经禁止了它对远程/网络事务的支持
  5. mysql bin 恢复工具_基于binlog恢复工具mysqlbinlog_flashback
  6. 如何在 Mac 上使用“接力”回到上次离开的地方?
  7. tensorflow中获取shape的方法比较
  8. 68.vivado与modelsim的关联以及器件库编译
  9. Python批量压缩图片(TinyPNG)
  10. 蜗牛连珠五子棋改进版
  11. O'Stolz 定理及其应用
  12. 如何群发邮件?教你发邮件时文件怎么命名、如何设置邮件格式,一文解决你的疑惑
  13. 无法在未启用宏的工作薄
  14. tensorflow学习笔记——获取训练数据集和测试数据集
  15. dad my_【玩转英文绘本】My Dad!《我爸爸》
  16. 搭建Vulhub靶场 【附图】
  17. 开发一个电商网站大概多少钱
  18. vue中使用电子签名
  19. 物联网开发之esp8266连接onenet控制板载小灯(二)
  20. 关于尔雅平台通识课《创业创新执行力》的考试方法与考试须知

热门文章

  1. KUDU(二)kudu架构设计
  2. 【Easy Python】第四话:爬虫初探——玩转豆瓣二百五(下)
  3. spring @Autowire 的注解默认是按类型注入bean
  4. 如何查看Android手机CPU类型是armeabi,armeabi-v7a,还是arm64-v8a?
  5. 从炉石传说卡组推荐理解ASO搜索优化,aso搜索优化怎么用
  6. 从这里可以看到存储过程被 修改的时间 嘎嘎嘎
  7. python怎么输出1到100的数字集合_python 如何将一系列数字十个一行输出
  8. TZC 初中信息技术(python)题单————题解
  9. axios中params和data的区别
  10. c语言散列表的构造和查找,简单的哈希表实现 C语言