最长公共子串(Longest Common Substirng)和最长公共子序列(Longest Common Subsequence,LCS)的区别为:子串是串的一个连续的部分,子序列则是从不改变序列的顺序,而从序列中去掉任意的元素而获得新的序列;也就是说,子串中字符的位置必须是连续的,子序列则可以不必连续。

1、序列str1和序列str2
 
  ·长度分别为m和n;
  ·创建1个二维数组L[m.n];
    ·初始化L数组内容为0
    ·m和n分别从0开始,m++,n++循环:
       - 如果str1[m] == str2[n],则L[m,n] = L[m - 1, n -1] + 1;
       - 如果str1[m] != str2[n],则L[m,n] = max{L[m,n - 1],L[m - 1, n]}
    ·最后从L[m,n]中的数字一定是最大的,且这个数字就是最长公共子序列的长度
    ·从数组L中找出一个最长的公共子序列
 
   2、从数组L中查找一个最长的公共子序列
 
   i和j分别从m,n开始,递减循环直到i = 0,j = 0。其中,m和n分别为两个串的长度。
  ·如果str1[i] == str2[j],则将str[i]字符插入到子序列内,i--,j--;
  ·如果str1[i] != str[j],则比较L[i,j-1]与L[i-1,j],L[i,j-1]大,则j--,否则i--;(如果相等,则任选一个)
 

我们可以得到其中公共子串:B C B A 和 B D A B。

  1. #include <iostream>
  2. #define N 1000
  3. using namespace std;
  4.  
  5. //c[i][j]存储str1[1...i]与str2[1...j]的最长公共子序列的长度
  6. int c[N][N];
  7. //flag[i][j]标记是那种子问题
  8. //flag[i][j]==0为str1[i]==str2[j]
  9. //flag[i][j]==1为c[i-1][j]>=s[i][j-1]
  10. //flag[i][j]==-1为c[i-1][j]<s[i][j-1]
  11. int flag[N][N];
  12.  
  13. int getLCSlength(string str1, string str2)
  14. {
  15. int len1 = str1.size();
  16. int len2 = str2.size();
  17. for (int i = ; i <= len1; i++)
  18. {
  19. for (int j = ; j <= len2; j++)
  20. {
  21. if (i == || j == )
  22. c[i][j] = ;
  23. else if (str1[i - ] == str2[j - ])
  24. {
  25. c[i][j] = c[i - ][j - ] + ;
  26. flag[i][j] = ;
  27. }
  28. else if (c[i - ][j] >= c[i][j - ]){
  29. c[i][j] = c[i - ][j];
  30. flag[i][j] = ;
  31. }
  32. else{
  33. c[i][j] = c[i][j - ];
  34. flag[i][j] = -;
  35. }
  36. }
  37. }
  38. return c[len1][len2];
  39. }
  40.  
  41. void getLCS(string s1, string s2,int len,char *lcs)
  42. {
  43. int i = s1.size();
  44. int j = s2.size();
  45. while(i&&j)
  46. {
  47. if(flag[i][j]==)
  48. {
  49. lcs[--len] = s1[i-];
  50. i--;
  51. j--;
  52. }
  53. else if(flag[i][j]==) //往上
  54. i--;
  55. else if(flag[i][j]==-)//往左
  56. j--;
  57. }
  58.  
  59. }
  60.  
  61. int main()
  62. {
  63. string str1,str2,lcs;
  64.    char lcs[N];
  65. cout<<"请输入字符串1:"<<endl;
  66. cin>>str1;
  67. cout<<"请输入字符串2:"<<endl;
  68. cin>>str2;
  69.  
  70. int lcsLen = getLCSlength(str1,str2);
  71. cout<<"最长公共子序列长度:"<<lcsLen<<endl;
  72.  
  73. getLCS(str1,str2,lcsLen,lcs);
  74. cout<<"最长公共子序列为:";
  75. for(int i=;i<lcsLen;i++)
  76. cout<<lcs[i];
  77. return ;
  78. }

最长公共子序列(LCS)问题的更多相关文章

  1. 1006 最长公共子序列Lcs

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 51nod 1006:最长公共子序列Lcs

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

  10. 动态规划之最长公共子序列(LCS)

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

随机推荐

  1. Linux下无图形界面安装Matlab

    1 下载R2015b_glnxa64.iso和破解文件Matlab+2015b+Linux64+Crack 百度网盘可以直接搜索资源.推荐一个可以多线程下载百度网盘超大文件的工具Aria2,均速1.3 ...

  2. Main函数中的参数argc,argv的使用简单解析

    本篇文章是对Main函数中的参数argc,argv的使用进行了简单的分析介绍,需要的朋友参考下: C/C++语言中的main函数,经常带有参数argc,argv,如下:  int main(int a ...

  3. [干货分享]AXURE整套高保真UI框架和元件组(白色风格)

      写在前面 强烈建议开始之前阅读以下第一篇高保真UI框架的前面部分,以了解设计思想,这篇文章不再重复介绍: AXURE-整套可复用的高保真元件和框架之暗黑风格 本次共享模板的UI规范 注:由于篇幅问 ...

  4. B. DZY Loves Modification

    B. DZY Loves Modification time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  5. text-transform 字母的大小写

    text-transform: none   默认 capitalize    每个单词以大写字母开头 uppercase    仅有大写字母 lowercase     无大写字母,仅有小写字母 i ...

  6. 字典(dict),增删改查,嵌套

    一丶字典 dict 用{}来表示  键值对数据  {key:value}  唯一性 键 都必须是可哈希的 不可变的数据类型就可以当做字典中的键 值 没有任何限制 二丶字典的增删改查 1.增 dic[k ...

  7. vue-cli 该如何正确打包iconfont?

    其实这种问题应该问google的: got wrong bootstrap font path after building · Issue #166 · vuejs-templates/webpac ...

  8. ecshop分类页把分类描述改成FCKeditor编辑器

    最近放一个网站 http://www.macklin.cn/productline/35 有个产品分类页面需要添加分类缩略图和图文的描述 一.首先说下添加分类缩略图的步骤吧 1,依葫芦画瓢,参照的是e ...

  9. God made relatives.Thank God we can choose our friends.

    God made relatives.Thank God we can choose our friends. 神决定了谁是你的亲戚, 幸运的是在选择朋友方面他给了你留了余地

  10. Object类-try-catch-finally-throw-throws-自定义异常

    一.Object类     Object类是最顶端的类,其它类都是它的子类,它的方法可以被继承.如果定义的类没有继承别的类,那它的直接父类就是Object.如果方法参数类型为object类型, 则调用 ...