文章目录

  • 定义
    • 样例1
    • 样例2
  • 递推公式
  • 样例过程图解
  • c语言代码

定义

给出两个字符串 str1 和 str2,返回同时以 str1 和 str2 作为子序列的最短字符串。如果答案不止一个,则可以返回满足条件的任意一个答案。

(如果从字符串 T 中删除一些字符(也可能不删除,并且选出的这些字符可以位于 T 中的 任意位置),可以得到字符串 S,那么 S 就是 T 的子序列)

样例1

输入:str1 = “abac”, str2 = “cab”
输出:“cabac”
解释:删去 “cabac” 第一个字母的 “c” 得到 “abac”。
删去 “cabac” 最后两个字母 “ac” 得到 “cab”。

样例2

输入:str1 = “AABXFGA”, str2 = “ABAAXGF”
输出:“ABAABXGFGA”
解释:删去 “ABAABXGFGA” 加黑字母 得到"AABXFGA"。
删去 "ABAABXGFGA “加黑字母"ABAAXGF”。

递推公式

最短公共超序列和最长公共子序列有些相似、
设序列X={x1,x2…xm},Y={y1,y2…yn}
X与Y的最短公共超序列为Z={z1,z2…zk}(z都是x和y序列中的字符)
dp(m,n)表示序列X的前m项和序列Y的前n项的最短公共超序列的位数

  1. 当X(Y)至少有一个序列为空时:
    此时最短公共超序列z一定要包含X(Y)全部字符,而求最短公共超序列,于是最短公共超序列就是X(Y)

Y为空时:dp(i,0)=i (1<=i<=m)
X为空时:dp(0,j)=j (1<=j<=n)

  1. 当Xm=Yn时
    此时,该字母一定包含在最短公共超序列中,相等就只需要加一个就好啦。(比如x中是a,y中也是a,最短公共超序列中只需要加一个a就行了)

dp(m,n)=dp(m-1,n-1)+1

  1. 当Xm!=Yn时, 当xm(yn)为最短公共超序列中需要新添加的一个字符时(x出现了一个从来没出来的字符)

dp[i][j]=dp[i-1][j]+1
dp[i][j]=dp[i][j-1]+1

则递推公式为:

样例过程图解

str1 = “AABXFGA”,
str2 = “ABAAXGF”

10为最后的结果,蓝色代表其中的一种解

c语言代码

#include <stdio.h>
#include <string.h>
int max(int a,int b){if(a>b)return a;else return b;}
int min(int a,int b){if(a<b)return a;else return b;}
int dp[105][105],len1,len2,cou=0;
char a[105],b[105],c[105];  //a,b用来存放输入的两个字符串,c存放最短公共超序列的一种解
int main()
{   int i,j;scanf("%s",&a);scanf("%s",&b);len1=strlen(a);len2=strlen(b);for(i=strlen(a);i>0;i--)  //为了方便dp数组的操作,我将字符往后移动一位 a[i]=a[i-1];for(i=strlen(b);i>0;i--)b[i]=b[i-1];a[0]='0';  //随便给的值 b[0]='1';for(i=0;i<=max(len1,len2);i++)   //当某个字符串为空时,赋初值 dp[i][0]=dp[0][i]=i;for(i=1;i<=len1;i++){for(j=1;j<=len2;j++){if(a[i]==b[j])dp[i][j]=dp[i-1][j-1]+1; //根据递推公式求dp() else dp[i][j]=min(dp[i-1][j],dp[i][j-1])+1;}}i=len1;j=len2;while(i>0&&j>0)    //根据比较最后的值是怎么来的,计算出最短超序列的一种解 {if(dp[i][j]==dp[i-1][j-1]+1&&a[i]==b[j])  //相等时 {c[cou]=a[i];cou++;i--;j--;}else if(dp[i][j]==dp[i-1][j]+1&&a[i]!=b[j])//来自a {c[cou]=a[i];cou++;i--;}else if(dp[i][j]==dp[i][j-1]+1&&a[i]!=b[j])//来自b {c[cou]=b[j];cou++;    j--;}    }while(i>0) //输入的字符串大小不等,或者在a,b中选取的个数不相等时,若第0行或者第0列没有选完时 {c[cou]=a[i];i--;cou++;}while(j>0){c[cou]=b[j];j--;cou++;}for(i=strlen(c)-1;i>=0;i--)   //输出其中一个最短超序列 printf("%c",c[i]);printf("\n");printf("\n%d",dp[len1][len2]);return 0;
}

最短公共超序列(最短公共父序列)相关推荐

  1. JavaScript实现shortestCommonSupersequence最短公共超序列算法(附完整源码)

    JavaScript实现shortestCommonSupersequence最短公共超序列算法(附完整源码) longestCommonSubsequence.js完整源代码 shortestCom ...

  2. C++shortest common supersequence最短公共超序列算法的实现(附完整源码)

    C++shortest common supersequence最短公共超序列算法的实现 C++shortest common supersequence最短公共超序列算法的实现的完整源码(定义,实现 ...

  3. 最短公共子序列_最短公共超序列

    最短公共子序列 Problem statement: 问题陈述: Given two strings, you have to find the shortest common super seque ...

  4. 动态规划最常见的习题 (最长公共子串、最长公共子序列、最短编辑距离)

    (1)理论部分: (2)习题: 最长公共子串: 1 package month7.dp; 2 3 //https://www.nowcoder.com/questionTerminal/181a1a7 ...

  5. 数据结构 - 字符串 - 最长公共子序列 + 最长公共子字符串 - 动态规划

    最长公共子序列 /*** 最长公共子序列* 参考链接:http://blog.csdn.net/biangren/article/details/8038605* Created by 18710 o ...

  6. 动态规划算法之:最长公共子序列 最长公共子串(LCS)

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

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

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

  8. oracle 伪列访问序列,Oracle同义词与序列基础教程

    一.同义词 同义词是现有对象(表.视图.序列.过程.函数.包等)的别名 作用: 简化SQL语句 隐藏对象的名称和所有者 提供对对象的公共访问 同义词共有两种类型: 1,私有同义词-公有同义词可被所有的 ...

  9. java索引序列_视图、序列、索引

    视图 视图(VIEW)也被称作虚表,即虚拟的表,是一组数据的逻辑表示. 视图对应于一个SELECT语句,结果集被賦予一个名字,即视图名字. 视图本身并不包含任何数据,它只包含映射到基表的一个查询语句, ...

最新文章

  1. python字典一键多值_python字典中如何一键多值的写入?
  2. CSDN”原力计划“在召唤:技术人请集结,用原创技术影响万千开发者
  3. 【翻译】SQL Server索引进阶:第八级,唯一索引
  4. Qt实现应用程序单实例运行--LocalServer方式
  5. SMW0上传模板下载到本地
  6. vue2的响应式原理学“废”了吗?继续观摩vue3响应式原理Proxy
  7. [python作业AI毕业设计博客]比Selenium IDE更好用的录制工具: Katalon Recorder
  8. linux下svn的常用代码【转】
  9. elementary os(ubuntu)开启ipv6 与走SwitchyOmega代理
  10. Gulp browserify livereload
  11. 刷新按钮_不能忍:用户求微软为Win10 Wi-Fi窗口添加刷新按钮
  12. Spring Boot 集成 RabbitMQ 升级
  13. (2)Linux环境下安装和使用Redis
  14. UVA.12230.Crossing Rivers(期望)
  15. 技术员 Ghost Win10 x86 装机版/纯净版 201710
  16. vue 组件自己调用自己
  17. 深度学习-感知机模型---思路图解+python代码
  18. 2019 Multi-University Training Contest 6:Snowy Smile(线段树查询最大子段和)
  19. web前端程序员职位介绍
  20. 理解英飞凌MOSFET器件的数据手册

热门文章

  1. 使用Python自动遍历并删除扫描PDF中的空白页
  2. ABAP ALV LVC模板
  3. Unity3D中的动态字体和静态字体
  4. MySQL 详细安装(亲测)
  5. 互联互通PSAM卡发卡注意事项与要点总结
  6. Nginx 动静分离 -02
  7. mysql 基础语法3
  8. 王 第潜艇三天 引用类型 继承
  9. 园区SDN网络自动化能力优化思路
  10. 截图工具当前未在计算机上运行 请重启_一个顶十个的工具箱软件,这才是真正的装机必备。...