想了挺久到底第一篇在这儿的博客写什么好,刚好这两天又一次看到动态规划的LCS算法觉得还是有点意思的,就拿来写了写,第一篇博客就发它吧。

#include<iostream>
#include<iomanip>
using namespace std;
//tag标志,0为左斜上,1取左,2取上;count为最长公共子序列计数
//计算最长公共子序列长度
void LCS_Length(char *X, char *Y, int *count[],int *tag[],int length_X, int length_Y)
{//第一排第一列全部是0for (int i = 0; i < length_X+1; i++){count[i][0] = 0;}for (int i = 0; i < length_Y+1; i++){count[0][i] = 0;}for (int i = 1; i <= length_X; i++){for (int j = 1; j <= length_Y; j++){if (X[i-1] == Y[j - 1]){count[i][j] = count[i-1][j-1]+1;tag[i][j] = 0;}//否则取较大的值else if(count[i-1][j] > count[i][j-1]){count[i][j] = count[i-1][j];tag[i][j] = 1;}else{count[i][j] = count[i][j-1];tag[i][j] = 2;}}}
}
//打印最长公共子序列元素
void Print_LCS(int *tag[],char *X,int Length_X, int Length_Y)
{if (Length_X == 0 || Length_Y == 0){return ;} int i = Length_X, j = Length_Y;if (tag[i][j] == 0){cout<<X[i-1]<<setw(4);Print_LCS(tag,X,i-1,j-1);}else if(tag[i][j] == 1){Print_LCS(tag,X,i-1,j);}else{Print_LCS(tag,X,i,j-1);}
}int main()
{//先人为设置两个序列char *X = "BDCABA";char *Y = "ABCBDA";int *count[7];for (int i = 0; i < 7; i++){count[i] = new int[7];       //因为第一行第一列全为0,所以总共七行七列
    }int *tag[7];for (int i = 0; i < 7; i++){tag[i] = new int[7];}LCS_Length(X,Y,count,tag,strlen(X),strlen(Y));cout<<"最大子序列数为"<<count[6][6]<<endl;/****************************************for(int i= 0; i <7; i++){for (int j = 0; j < 7; j++){cout<<count[i][j]<<setw(3);}cout<<endl;}*****************************************/Print_LCS(tag,X,strlen(X),strlen(Y));cout<<endl;return 0;
}

  主要函数有两个,一个函数是做出保存最长公共子序列的元素个数的矩阵,这里给出的示例中,两个字符串都各6个字符,所以给出的是7行7列矩阵(第一行第一列全为零)。

另外一个函数即为打印函数,从矩阵右下角一位开始遍历到[0][0]位,凡是遇到tag[i][j]标志为0则将该位的字符打印出来。算法比较简单易懂,具体可以参考《算法导论》。

下面补充说一个问题:二维指针到底怎么用。比如前面的二维数组初始化,如果我希望能够通过字符串的长度来给我的二维数组定义大小,而不是用常数来指定,使得我们可以通过strlen()函数来定义长度,那么就要用到二维指针。

注意:int *Arr[strlen(str)];这种声明方式是不正确的,编译器会提示错误,数组的声明必须使用常量。下面给出正确的示例:

        /***********************************************//华丽丽的分割线--------------------------------二维指针到底怎么用int *(*ptr) = new int*[strlen(X)];for (int i = 0; i < strlen(X); i++){ptr[i] = new int[strlen(X)];}ptr[2][3] = 0;cout<<ptr[2][3]<<endl;**********************************************/

转载于:https://www.cnblogs.com/nerohwang/p/3480448.html

最长公共子序列的C++实现---附二维指针的使用方法相关推荐

  1. c语言最长公共子序列_序列比对(二十四)——最长公共子序列

    原创: hxj7 本文介绍如何求解两个字符串的最长公共子序列. 最长公共子序列问题 前文<序列比对(二十三)--最长公共子字符串>介绍了如何求解两个字符串的最长公共子字符串,本文将介绍如何 ...

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

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

  3. LCS(最长公共子序列)

    题意描述 求两个字符串的最长公共子序列的长度 动态规划 用二维数组 C[i][j] 记录串x1x2⋯xi与y1y2⋯yj 的 LCS长度,则可得到状态转移方程: 代码实现: #include<i ...

  4. 最长公共子序列求序列模板提_最长公共子序列

    最长公共子序列求序列模板提 Description: 描述: This question has been featured in interview rounds of Amazon, MakeMy ...

  5. 最长公共子序列(LCS)算法

    一.最长公共字串与最长公共子序列 最长公共子串(Longest Common Substirng) 子串是串的一个连续的部分,子串中字符的位置必须连续. 例如:有两个字符串ABCBDAB 和 BDCA ...

  6. 最长公共子序列长度的四种解法

    一.题目:求两个字符序列的最长公共字符子序列.给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence).比如字符串1:BDCABA:字符串2:ABCBDAB, ...

  7. 1143.最长公共子序列

    1143.最长公共子序列 文章目录 1143.最长公共子序列 一.题目描述 二.方法一:暴力法 三.方法二.动态规划 四.补充:打印输出最长公共子串 五:心得体会 1143. 最长公共子序列 一.题目 ...

  8. JavaScript实现longestCommonSubsequence最长公共子序列算法(附完整源码)

    JavaScript实现longestCommonSubsequence最长公共子序列算法(附完整源码) longestCommonSubsequence.js完整源代码 longestCommonS ...

  9. C++longest common subsequence最长公共子序列的实现(附完整源码)

    C++longest common subsequence最长公共子序列 longest common subsequence最长公共子序列的完整源码(定义,实现,main函数测试) longest ...

最新文章

  1. 企业号、订阅号、服务号的一此区别
  2. 两个字符串之间的连接函数,不使用strcat()函数
  3. MQ各个元素的详细理解
  4. Flex4与WebService通信
  5. LVS(11)——wrr
  6. QT4.8界面设计(MSVC2010X)+位姿哈希+ICP结果
  7. TWiki 语法格式(TWiki语法教程及TWiki使用技巧)
  8. 前端学习(2336):angular之传递参数
  9. 第三章 MongoDb Java应用 3.2
  10. 博主推荐【文件Hash校验工具V1.0 -免费版】
  11. 基于Gulp的简易前端自动化工程搭建
  12. 常用针织实用技术名词
  13. 二十、Java基础--------IO流之其他对象
  14. 笔记四:onsubmit和onclick的区别
  15. 大话MIMO-OFDM联合工作实现过程
  16. 机器学习-手写数字识别系统
  17. web开发需要用什么软件
  18. SPSS与对应分析(类别简单型)
  19. 不知道起什么标题 03
  20. CSS中怎样调整字体之间的间隔

热门文章

  1. 一旦一个业务可以由一个人来全部完成而不涉及分工,就会产生单干的情况
  2. HDU-1128 Self Numbers 筛选
  3. TCP/IP之传输层(一)
  4. Tungsten Fabric SDN — Service Chain — 高级特性
  5. VMware 虚拟化编程(8) — 多线程中的 VixDiskLib
  6. 用 Flask 来写个轻博客 (2) — Hello World!
  7. keil 器件是空的,Keil的Device为空,不能选择器件
  8. 突然关机导致git文件受损,如何处理
  9. SQLServer 2012 报表服务部署配置(1)
  10. zend opcache的最佳设置