1. public static int lcs(String str1, String str2) {
  2. int len1 = str1.length();
  3. int len2 = str2.length();
  4. int c[][] = new int[len1+1][len2+1];
  5. for (int i = 0; i <= len1; i++) {
  6. for( int j = 0; j <= len2; j++) {
  7. if(i == 0 || j == 0) {
  8. c[i][j] = 0;
  9. } else if (str1.charAt(i-1) == str2.charAt(j-1)) {
  10. c[i][j] = c[i-1][j-1] + 1;
  11. } else {
  12. c[i][j] = max(c[i - 1][j], c[i][j - 1]);
  13. }
  14. }
  15. }
  16. return c[len1][len2];
  17. }
  1. public class LCSProblem
  2. {
  3. public static void main(String[] args)
  4. {
  5. //保留空字符串是为了getLength()方法的完整性也可以不保留
  6. //但是在getLength()方法里面必须额外的初始化c[][]第一个行第一列
  7. String[] x = {"", "A", "B", "C", "B", "D", "A", "B"};
  8. String[] y = {"", "B", "D", "C", "A", "B", "A"};
  9. int[][] b = getLength(x, y);
  10. Display(b, x, x.length-1, y.length-1);
  11. }
  12. /**
  13. * @param x
  14. * @param y
  15. * @return 返回一个记录决定搜索的方向的数组
  16. */
  17. public static int[][] getLength(String[] x, String[] y)
  18. {
  19. int[][] b = new int[x.length][y.length];
  20. int[][] c = new int[x.length][y.length];
  21. for(int i=1; i<x.length; i++)
  22. {
  23. for(int j=1; j<y.length; j++)
  24. {
  25. //对应第一个性质
  26. if( x[i] == y[j])
  27. {
  28. c[i][j] = c[i-1][j-1] + 1;
  29. b[i][j] = 1;
  30. }
  31. //对应第二或者第三个性质
  32. else if(c[i-1][j] >= c[i][j-1])
  33. {
  34. c[i][j] = c[i-1][j];
  35. b[i][j] = 0;
  36. }
  37. //对应第二或者第三个性质
  38. else
  39. {
  40. c[i][j] = c[i][j-1];
  41. b[i][j] = -1;
  42. }
  43. }
  44. }
  45. return b;
  46. }
  47. //回溯的基本实现,采取递归的方式
  48. public static void Display(int[][] b, String[] x, int i, int j)
  49. {
  50. if(i == 0 || j == 0)
  51. return;
  52. if(b[i][j] == 1)
  53. {
  54. Display(b, x, i-1, j-1);
  55. System.out.print(x[i] + " ");
  56. }
  57. else if(b[i][j] == 0)
  58. {
  59. Display(b, x, i-1, j);
  60. }
  61. else if(b[i][j] == -1)
  62. {
  63. Display(b, x, i, j-1);
  64. }
  65. }
  66. }
  1. public static int lcs(String str1, String str2) {
  2. int len1 = str1.length();
  3. int len2 = str2.length();
  4. int result = 0; //记录最长公共子串长度
  5. int c[][] = new int[len1+1][len2+1];
  6. for (int i = 0; i <= len1; i++) {
  7. for( int j = 0; j <= len2; j++) {
  8. if(i == 0 || j == 0) {
  9. c[i][j] = 0;
  10. } else if (str1.charAt(i-1) == str2.charAt(j-1)) {
  11. c[i][j] = c[i-1][j-1] + 1;
  12. result = max(c[i][j], result);
  13. } else {
  14. c[i][j] = 0;
  15. }
  16. }
  17. }
  18. return result;
  19. }
  1. public class stringCompare {
  2. //在动态规划矩阵生成方式当中,每生成一行,前面的那一行就已经没有用了,因此这里只需使用一维数组,而不是常用的二位数组
  3. public static void getLCString(char[] str1, char[] str2) {
  4. int len1, len2;
  5. len1 = str1.length;
  6. len2 = str2.length;
  7. int maxLen = len1 > len2 ? len1 : len2;
  8. int[] max = new int[maxLen];// 保存最长子串长度的数组
  9. int[] maxIndex = new int[maxLen];// 保存最长子串长度最大索引的数组
  10. int[] c = new int[maxLen];
  11. int i, j;
  12. for (i = 0; i < len2; i++) {
  13. for (j = len1 - 1; j >= 0; j--) {
  14. if (str2[i] == str1[j]) {
  15. if ((i == 0) || (j == 0))
  16. c[j] = 1;
  17. else
  18. c[j] = c[j - 1] + 1;//此时C[j-1]还是上次循环中的值,因为还没被重新赋值
  19. } else {
  20. c[j] = 0;
  21. }
  22. // 如果是大于那暂时只有一个是最长的,而且要把后面的清0;
  23. if (c[j] > max[0]) {
  24. max[0] = c[j];
  25. maxIndex[0] = j;
  26. for (int k = 1; k < maxLen; k++) {
  27. max[k] = 0;
  28. maxIndex[k] = 0;
  29. }
  30. }
  31. // 有多个是相同长度的子串
  32. else if (c[j] == max[0]) {
  33. for (int k = 1; k < maxLen; k++) {
  34. if (max[k] == 0) {
  35. max[k] = c[j];
  36. maxIndex[k] = j;
  37. break; // 在后面加一个就要退出循环了
  38. }
  39. }
  40. }
  41. }
  42. for (int temp : c) {
  43. System.out.print(temp);
  44. }
  45. System.out.println();
  46. }
  47. //打印最长子字符串
  48. for (j = 0; j < maxLen; j++) {
  49. if (max[j] > 0) {
  50. System.out.println("第" + (j + 1) + "个公共子串:");
  51. for (i = maxIndex[j] - max[j] + 1; i <= maxIndex[j]; i++)
  52. System.out.print(str1[i]);
  53. System.out.println(" ");
  54. }
  55. }
  56. }
  57. public static void main(String[] args) {
  58. String str1 = new String("binghaven");
  59. String str2 = new String("jingseven");
  60. getLCString(str1.toCharArray(), str2.toCharArray());
  61. }
  62. }
  63.  
  64. /*
    000000000
    010000000
    002000001
    000300000
    000000000
    000000010
    000000100
    000000020
    001000003
    第1个公共子串:
    ing
    第2个公共子串:
    ven
    */

经典算法-最长公共子序列(LCS)与最长公共子串(DP)的更多相关文章

  1. 每日一题-——最长公共子序列(LCS)与最长公共子串

    最长公共子序列(LCS) 思路: 代码: def LCS(string1,string2): len1 = len(string1) len2 = len(string2) res = [[0 for ...

  2. 最长连续公共子序列(LCS)与最长递增公共子序列(LIS)

    最长公共子序列(不连续) 实际问题中也有比较多的应用,比如,论文查重这种,就是很实际的一个使用方面. 这个应该是最常见的一种了,不再赘述,直接按照转移方程来进行: 按最普通的方式就是,直接构造二维矩阵 ...

  3. 51nod 1006 最长公共子序列Lcs(经典动态规划)

    传送门 Description 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的).   比如两个串为:   abcicba abdkscab   ab是两个串的子序列,abc也是 ...

  4. 编程算法 - 最长公共子序列(LCS) 代码(C)

    最长公共子序列(LCS) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定两个字符串s,t, 求出这两个字符串最长的公共子序列的长度. 字符 ...

  5. 动态规划之最长公共子序列LCS(Longest Common Subsequence)

    一.问题描述 由于最长公共子序列LCS是一个比较经典的问题,主要是采用动态规划(DP)算法去实现,理论方面的讲述也非常详尽,本文重点是程序的实现部分,所以理论方面的解释主要看这篇博客:http://b ...

  6. C++版 - Lintcode 77-Longest Common Subsequence最长公共子序列(LCS) - 题解

    版权声明:本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - L ...

  7. 1006 最长公共子序列Lcs

    1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdks ...

  8. POJ 1458 Common Subsequence(最长公共子序列LCS)

    POJ1458 Common Subsequence(最长公共子序列LCS) http://poj.org/problem?id=1458 题意: 给你两个字符串, 要你求出两个字符串的最长公共子序列 ...

  9. 51Nod 1006:最长公共子序列Lcs(打印LCS)

    1006 最长公共子序列Lcs  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...

  10. 51nod 1006 最长公共子序列Lcs 【LCS/打印path】

    1006 最长公共子序列Lcs  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...

随机推荐

  1. jquery ajax的知识点

    jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(p ...

  2. java修饰符——transient

    一.背景 上星期去CRM上开发一个功能,该系统里面有自动分页,需要在实体类里加入一个分页变量 // 分页 private PageInfo pageInfo = new PageInfo(); 这个本 ...

  3. codeforces——contest 864 problemE

    Polycarp is in really serious trouble — his house is on fire! It's time to save the most valuable it ...

  4. 【BZOJ】4430: [Nwerc2015]Guessing Camels赌骆驼

    [题意]给定三个长度为n的排列,求在三个排列中顺序相同的数对个数. [算法]逆序对 [题解]很容易联想到NOIP火柴排队,涉及顺序问题显然和逆序对息息相关. 一个数对如果在三个排列中顺序不同,一定是1 ...

  5. ios的app,有新版本时必须先更新。

    现在没时间整理,先把代码贴出来,以后再做详细的思路整理. 1 在AppController.mm的didFinishLaunchingWithOptions方法里面获取本地应用版本信息,保存起来. / ...

  6. nyoj 15 括号匹配(二) (经典dp)

    题目链接 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些 ...

  7. Kill windows和linux 进程

    Windows

  8. ubuntu中使用virtualbox遇到Kernel driver not installed (rc=-1908)错误

    百度之后得到解决,再此做个笔记 错误提示 Kernel driver not installed (rc=-1908) The VirtualBox Linux kernel driver (vbox ...

  9. selenium===requestium模块介绍

    有时,你可能会在网上实现一些自动化操作.比如抓取网站,进行应用测试,或在网上填表,但又不想使用API,这时自动化就变得很必要.Python提供了非常优秀的Requests库可以辅助进行这些操作.可惜, ...

  10. DevExpress.XtraTreeList 小结

    搞了半天才绑定好,没有弄清楚父子之间的关系 <dx:ASPxTreeList ID="ASPxTreeList1" runat="server" Auto ...