最短公共超序列(最短公共父序列)
文章目录
- 定义
- 样例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项的最短公共超序列的位数
- 当X(Y)至少有一个序列为空时:
此时最短公共超序列z一定要包含X(Y)全部字符,而求最短公共超序列,于是最短公共超序列就是X(Y)
Y为空时:dp(i,0)=i (1<=i<=m)
X为空时:dp(0,j)=j (1<=j<=n)
- 当Xm=Yn时
此时,该字母一定包含在最短公共超序列中,相等就只需要加一个就好啦。(比如x中是a,y中也是a,最短公共超序列中只需要加一个a就行了)
dp(m,n)=dp(m-1,n-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;
}
最短公共超序列(最短公共父序列)相关推荐
- JavaScript实现shortestCommonSupersequence最短公共超序列算法(附完整源码)
JavaScript实现shortestCommonSupersequence最短公共超序列算法(附完整源码) longestCommonSubsequence.js完整源代码 shortestCom ...
- C++shortest common supersequence最短公共超序列算法的实现(附完整源码)
C++shortest common supersequence最短公共超序列算法的实现 C++shortest common supersequence最短公共超序列算法的实现的完整源码(定义,实现 ...
- 最短公共子序列_最短公共超序列
最短公共子序列 Problem statement: 问题陈述: Given two strings, you have to find the shortest common super seque ...
- 动态规划最常见的习题 (最长公共子串、最长公共子序列、最短编辑距离)
(1)理论部分: (2)习题: 最长公共子串: 1 package month7.dp; 2 3 //https://www.nowcoder.com/questionTerminal/181a1a7 ...
- 数据结构 - 字符串 - 最长公共子序列 + 最长公共子字符串 - 动态规划
最长公共子序列 /*** 最长公共子序列* 参考链接:http://blog.csdn.net/biangren/article/details/8038605* Created by 18710 o ...
- 动态规划算法之:最长公共子序列 最长公共子串(LCS)
1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...
- 最长公共子序列算法 java_转【算法之动态规划(三)】动态规划算法之:最长公共子序列 最长公共子串(LCS)字符串相似度算法...
1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...
- oracle 伪列访问序列,Oracle同义词与序列基础教程
一.同义词 同义词是现有对象(表.视图.序列.过程.函数.包等)的别名 作用: 简化SQL语句 隐藏对象的名称和所有者 提供对对象的公共访问 同义词共有两种类型: 1,私有同义词-公有同义词可被所有的 ...
- java索引序列_视图、序列、索引
视图 视图(VIEW)也被称作虚表,即虚拟的表,是一组数据的逻辑表示. 视图对应于一个SELECT语句,结果集被賦予一个名字,即视图名字. 视图本身并不包含任何数据,它只包含映射到基表的一个查询语句, ...
最新文章
- python字典一键多值_python字典中如何一键多值的写入?
- CSDN”原力计划“在召唤:技术人请集结,用原创技术影响万千开发者
- 【翻译】SQL Server索引进阶:第八级,唯一索引
- Qt实现应用程序单实例运行--LocalServer方式
- SMW0上传模板下载到本地
- vue2的响应式原理学“废”了吗?继续观摩vue3响应式原理Proxy
- [python作业AI毕业设计博客]比Selenium IDE更好用的录制工具: Katalon Recorder
- linux下svn的常用代码【转】
- elementary os(ubuntu)开启ipv6 与走SwitchyOmega代理
- Gulp browserify livereload
- 刷新按钮_不能忍:用户求微软为Win10 Wi-Fi窗口添加刷新按钮
- Spring Boot 集成 RabbitMQ 升级
- (2)Linux环境下安装和使用Redis
- UVA.12230.Crossing Rivers(期望)
- 技术员 Ghost Win10 x86 装机版/纯净版 201710
- vue 组件自己调用自己
- 深度学习-感知机模型---思路图解+python代码
- 2019 Multi-University Training Contest 6:Snowy Smile(线段树查询最大子段和)
- web前端程序员职位介绍
- 理解英飞凌MOSFET器件的数据手册