最长公共子序列的C++实现---附二维指针的使用方法
想了挺久到底第一篇在这儿的博客写什么好,刚好这两天又一次看到动态规划的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)
{
//第一排第一列全部是0
for (int i = ; i < length_X+; i++)
{
count[i][] = ;
}
for (int i = ; i < length_Y+; i++)
{
count[][i] = ;
} for (int i = ; i <= length_X; i++)
{
for (int j = ; j <= length_Y; j++)
{
if (X[i-] == Y[j - ])
{
count[i][j] = count[i-][j-]+;
tag[i][j] = ;
}
//否则取较大的值
else if(count[i-][j] > count[i][j-])
{
count[i][j] = count[i-][j];
tag[i][j] = ;
}
else
{
count[i][j] = count[i][j-];
tag[i][j] = ;
}
}
}
}
//打印最长公共子序列元素
void Print_LCS(int *tag[],char *X,int Length_X, int Length_Y)
{
if (Length_X == || Length_Y == )
{
return ;
}
int i = Length_X, j = Length_Y;
if (tag[i][j] == )
{
cout<<X[i-]<<setw();
Print_LCS(tag,X,i-,j-);
}
else if(tag[i][j] == )
{
Print_LCS(tag,X,i-,j);
}
else
{
Print_LCS(tag,X,i,j-);
}
} int main()
{
//先人为设置两个序列
char *X = "BDCABA";
char *Y = "ABCBDA";
int *count[];
for (int i = ; i < ; i++)
{
count[i] = new int[]; //因为第一行第一列全为0,所以总共七行七列
}
int *tag[];
for (int i = ; i < ; i++)
{
tag[i] = new int[];
}
LCS_Length(X,Y,count,tag,strlen(X),strlen(Y));
cout<<"最大子序列数为"<<count[][]<<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 ;
}
主要函数有两个,一个函数是做出保存最长公共子序列的元素个数的矩阵,这里给出的示例中,两个字符串都各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;
**********************************************/
最长公共子序列的C++实现---附二维指针的使用方法的更多相关文章
- 算法练习——最长公共子序列的问题(LCS)
问题描述: 对于两个序列X和Y的公共子序列中,长度最长的那个,定义为X和Y的最长公共子序列.X Y 各自字符串有顺序,但是不一定需要相邻. 最长公共子串(Longest Common Subst ...
- (最长公共子序列+推导)Love Calculator (lightOJ 1013)
http://www.lightoj.com/volume_showproblem.php?problem=1013 Yes, you are developing a 'Love calcula ...
- Lintcode--005(最长公共子序列)
Given two strings, find the longest common subsequence (LCS). 最长公共子序列 Your code should return th ...
- 洛谷 P2516 [HAOI2010]最长公共子序列
题目传送门 解题思路: 第一问要求最长公共子序列,直接套模板就好了. 第二问要求数量,ans[i][j]表示第一个字符串前i个字符,第二个字符串前j个字符的最长公共子序列的数量 如果f[i][j]是由 ...
- 用python实现最长公共子序列算法(找到所有最长公共子串)
软件安全的一个小实验,正好复习一下LCS的写法. 实现LCS的算法和算法导论上的方式基本一致,都是先建好两个表,一个存储在(i,j)处当前最长公共子序列长度,另一个存储在(i,j)处的回溯方向. 相对 ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
- [Data Structure] LCSs——最长公共子序列和最长公共子串
1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- LintCode 77: 最长公共子序列
public class Solution { /** * @param A, B: Two string. * @return: the length of the longest common s ...
随机推荐
- JavaScript入门:004—JS凝视的写法和基本运算符
JS的凝视JS中加凝视和寻常写C#代码是几乎相同的.有//和/* */这两种.单行凝视使用双斜杠比如. <script type="text/javascript"> ...
- SlidingMenu官方实例分析6——ResponsiveUIActivity
ResponsiveUIActivity 这个类实现的是一个响应适UI设计重点是布局的设计: layout布局如下: layout-large-land布局如下: layout-xlarge布局如下: ...
- Laravel5.1 模型 --一对一关系
这篇文章主要记录模型的一对一关系,关联关系是Model的一种非常方便的功能. 1 实现一对一关系 1.1 准备工作 首先我们需要创建两张表和对应的两个模型,第一个模型是用户表,第二个模型是账号表. 这 ...
- python数据分析之numpy
知乎:https://zhuanlan.zhihu.com/p/26514493 numoy安装:http://blog.csdn.net/wyc12306/article/details/53705 ...
- 利用libpcap分析网络上的数据包(入门级)
本文可任意转载,但请保留作者及出处作者:rainfish出处:http://blog.csdn.net/bat603/经过几天的突击,终于明白了怎样在局域网内抓包,这可是我多年来的梦想.首先说说我的学 ...
- linux /etc/security/limits.conf的相关说明
暂时粘贴他人的地址,后续会整理后放出. 原文地址:http://blog.csdn.net/taijianyu/article/details/5976319
- 任务05—学习 MARKDOWN 语言
我的简历地址: https://github.com/jinxiaohang/MyResume/blob/master/ForJavaJob.md 本任务主要目的掌握markdown. 1.首先是工具 ...
- Springboot整合thymeleaf模板
Thymeleaf是个XML/XHTML/HTML5模板引擎,可以用于Web与非Web应用. Thymeleaf的主要目标在于提供一种可被浏览器正确显示的.格式良好的模板创建方式,因此也可以用作静态建 ...
- python函数回顾:next()
描述 next() 返回迭代器的下一个项目. 语法 next(iterator[, default]) 参数说明: iterator -- 可迭代对象 default -- 可选,用于设置在没有下一个 ...
- return和yield的区别
# return 返回给调用者值,并结束此函数.#yiled 返回给调用者值,并将指针停留着当前位置.