题目
Description
给定两个序列 X={x1,x2,…,xm} 和 Y={y1,y2,…,yn},找出X和Y的最长公共子序列。

Input
输入数据有多组,每组有两行 ,每行为一个长度不超过500的字符串(输入全是大写英文字母(A,Z)),表示序列X和Y。

Output
每组输出一行,表示所求得的最长公共子序列的长度,若不存在公共子序列,则输出0。

Sample

Input
ABCBDAB
BDCABA
Output
4

答案

#include<bits/stdc++.h>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int len1,len2,c[501][501];
char x[501],y[501];
int main()
{while(scanf("%s %s",x,y)!=EOF){memset(c,0,sizeof(c));len1=strlen(x);len2=strlen(y);for(int i=0; i<=len1; i++) //列为0,y是空序列时与另一串的最长公共子序列{c[i][0]=0;}for(int j=0; j<=len2; j++) //行为0,X是空序列时的情况{c[0][j]=0;}for(int i=1; i<=len1; i++){for(int j=1; j<=len2; j++){if(x[i-1]==y[j-1])//小心x,和y都是从0开始的{c[i][j]=c[i-1][j-1]+1;}else{if(c[i-1][j]>c[i][j-1]){c[i][j]=c[i-1][j];}else{c[i][j]=c[i][j-1];}}}}printf("%d\n",c[len1][len2]);}return 0;
}

基本思路:
①定义一个字符串为行,一个字符串为列,从0-len1和从0到len2,组成一个二维数组c,不用管为什么,就是这么定义的,容易处理问题,然后把二维数组第一行置为0,先不解释,最后再说初始化。如下图,每一个位置都是最长的公共子序列的长度

②找序列的过程,分为三种情况
设:X,Y,Z分别为两个字符串,和公共串

Ⅰ : X最后一个字母,和Y最后一个相等,那么说明他们此时的最长公共子序列,就是两个序列都去掉最后一个字母的情况下子序列长度+1,
代码表示为

             if(x[i-1]==y[j-1]){c[i][j]=c[i-1][j-1]+1;//对应矩阵左上角}

如下图从左向右。

Ⅱ :X最后一个,和Y最后一个不相等,那么在不相等的情况下,最长公共子序列长度要么就是去掉X的最后一个字母情况下,新X与Y的公共串长度,或者是去掉Y最后一个字母情况下,新Y与X的公共串长度,可以想一下,从开始到最后,公共串长一直都是X,Y从空串逐个增加字母,变长的。现在回推回去。

                 if(c[i-1][j]>c[i][j-1]){c[i][j]=c[i-1][j];//对应现在位置上方矩阵}else{c[i][j]=c[i][j-1];//对应现在位置的左方矩阵}

如下图

③初始化
初始化为0是设置边界,保证咱们开始的时候从0推到最后,开始空串的时候,公共串都是0;

过程:
1.开始输入两个字符串
2.把代码上字符串逐渐减小(i-1,j-1),逐渐递归成空串,实质上是从空串推过来的。
3.把C数组计算完,输出最后一位。

D - 最长公共子序列问题-详细过程相关推荐

  1. 【编程题 动态规划】最长公共子序列(详细注释 易懂)

    题目描述: 题目链接:最长公共子序列__牛客网 来源:牛客网 我们有两个字符串m和n,如果它们的子串a和b内容相同,则称a和b是m和n的公共子序列.子串中的字符不一定在原字符串中连续. 例如字符串&q ...

  2. 最长公共子序列(详细代码 注释 分析 以及求出最长公共子序列内容方法)

    最长公共子序列 文章有些长,希望能够耐心看完,并且对你有帮助,文章是自己看了书之后,总结的,如果有什么错误的地方,欢迎指出. 一些基本的概念: 子序列: 原序列中删除若干个元素得到的序列,即原序列中可 ...

  3. 关于最长公共子序列的执行过程

    核心代码如下: for(i=0; i<=lens; i++) {for(j=0; j<=lent; j++){ if(i==0||j==0){dp[i][j]=0; continue;} ...

  4. 【算法设计与分析】最长公共子序列问题 动态规划算法 超详细

    最长公共子序列问题描述 注意:最长公共子序列不一定是连续序列. 例如:"ASAFAGAHAJAK"与"AAAAAAA"的最长公共子序列为:AAAAAA 公共子序 ...

  5. 动态规划求解最长公共子序列

    前言 推出一个新系列,<看图轻松理解数据结构和算法>,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握.本系列包括各种堆.各种队列.各种列表.各种树.各种图.各种排序等等几十篇的 ...

  6. 动态规划解最长公共子序列(LCS)(附详细填表过程)

    目录 相关概念 子序列形式化定义: 公共子序列定义: 最长公共子序列(以下简称LCS): 方法 蛮力法求解最长公共子序列: 动态规划求解最长公共子序列: 分析规律: 做法: 伪代码: 下面演示下c数组 ...

  7. 动态规划 最长公共子序列 过程图解

    长公共子序列(longest common sequence) 最长公共子串(longest common substring) 子序列:一个给定的序列的子序列,将给定序列中零个或多个元素去掉之后得到 ...

  8. 最长公共子序列(LCS问题)

    先简单介绍下什么是最长公共子序列问题,其实问题很直白,假设两个序列X,Y,X的值是ACBDDCB,Y的值是BBDC,那么XY的最长公共子序列就是BDC.这里解决的问题就是需要一种算法可以快速的计算出这 ...

  9. 程序员编程艺术第十一章:最长公共子序列(LCS)问题

    程序员编程艺术第十一章:最长公共子序列(LCS)问题 0.前言 程序员编程艺术系列重新开始创作了(前十章,请参考程序员编程艺术第一~十章集锦与总结).回顾之前的前十章,有些代码是值得商榷的,因当时的代 ...

最新文章

  1. JSONObject没有fromObject方法(Json lib 库的使用)
  2. 为什么说大盘很健康?
  3. java中堆与栈的区别 彻底理解
  4. 首个全球智慧城市在线社区启动 将锁定对城市发展构成挑战的困难
  5. div在最顶层显示----弹出框效果
  6. datax安装+配置+使用文档
  7. Oracle常用运维命令整理
  8. 【踩坑速记】开源日历控件,顺便全面解析开源库打包发布到Bintray/Jcenter全过程(新),让开源更简单~...
  9. 垃圾回收算法与实现系列-Java的Class文件详解
  10. PS中有哪些快速抠图的方法
  11. 基于python 爬虫网络舆情分析系统_基于Python的网络爬虫系统
  12. 收发短信AT指令详解
  13. 对JavaScript中 this 关键词的理解
  14. 雅虎搜索架构_雅虎! 想要推动您的网站搜索
  15. Pytorch 获取神经网络权重、偏执等参数
  16. mysql中ddl和ddm_DDL与DML问题
  17. 剑指Offer-22反转链表
  18. 【蓝桥杯】2019年第十届蓝桥杯(个人赛) 大赛介绍、注意事项及赛后总结
  19. 扎克伯格引领的硅谷“裸捐”风
  20. 为什么蓝牙小音箱会经常断开连接?

热门文章

  1. 计算机二级试题库office选择题,全国计算机二级MSOffice选择题试题库完整
  2. java 打印预览_java打印和打印预览机制实例代码
  3. (一)java版spring cloud+spring boot+redis多租户社交电子商务平台-简介
  4. webpack-loader(加载器)
  5. ThreadLocal 从源码角度简单分析
  6. 设置PYTHONIOENCODING
  7. js控制文件拖拽,获取拖拽内容。
  8. linux chromium安装falsh插件
  9. 将数据导入excel表格
  10. groovy和java结合使用