题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1503

题目大意:

给两个字符串,组成一个长度尽可能小的字符串,它包含上述两个字符串,且原字符串中的字符在该串中的相对位置不变。

Sample Input
apple peach
ananas banana
pear peach
 
Sample Output
appleach
bananas
pearch
 
解题思路:
要结合样例来理解题意,本题主要难在如何输出题目要求字符串,这就需要我们仔细研究样例,去发掘它是如何输出的,具体操作见代码。
 
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
int dp[][];
int vis[][]; //标记路径
int loca[], locb[]; //记录下最长公共子序列在这两个字符串中的位置
int lena, lenb; //a,b序列的长度
int len; //记录下最长公共子序列长度
string stra, strb; void locallcs(int i, int j) //标记好最长公共子序列的每一个字符分别在a,b字符中的位置
{
len = ;
while (i>&&j>)
{
if (vis[i][j] == )
{
loca[len] = i-; // 此时loca,locb数组记录的是最长公共子序列分别在啊a,b字符串中的位置
locb[len] = j-; //不过要注意此时记录的是逆序的,这个仔细看它存入的顺序就能明白
len++;
i--, j--;
}
else if (vis[i][j] == )j--;
else
i--;
}
} void output() //输出答案,至于为什么是这样输出,自己仔细研究题目的输出样例就能发现
{
int inverse = len - ;
int cur1 = ,cur2=;
while (inverse >= )
{
for (int i = cur1; i<loca[inverse]; i++) //输出a中两个相邻的公共子序列字符之间的字符
printf("%c", stra[i]);
for (int j = cur2; j < locb[inverse]; j++)
printf("%c", strb[j]);
printf("%c", stra[loca[inverse]]); //输出那个公共字符
cur1 = loca[inverse]+, cur2=locb[inverse]+;
inverse--;
}
for (int i = loca[]+; i < lena; i++)printf("%c", stra[i]); //输出最后一个公共子序列字符之后的字符
for (int j = locb[]+; j < lenb; j++)printf("%c", strb[j]);
cout << endl;
} int main()
{
while (cin >> stra >> strb)
{
lena = stra.length();
lenb = strb.length();
for (int i = ; i <= lena; i++)
{
for (int j = ; j <= lenb; j++)
{
if (!i || !j) {
dp[i][j] = ; continue;
}
if (stra[i - ] == strb[j - ])
{
dp[i][j] = dp[i - ][j - ] + ;
vis[i][j] = ; //标记输出路径
}
else if (dp[i - ][j] < dp[i][j - ]) //dp数组在本题起控制标记路径方向的作用
{
dp[i][j] = dp[i][j - ];
vis[i][j] = ;
}
else {
dp[i][j] = dp[i - ][j];
vis[i][j] = ;
}
}
}
locallcs(lena, lenb);
output();
}
return ;
}
 
2018-05-19

HDU 1503【LCS】(字符串合并输出)的更多相关文章

  1. hdu 1503 LCS输出路径【dp】

    hdu 1503 不知道最后怎么输出,因为公共部分只输出一次.有人说回溯输出,感觉好巧妙!其实就是下图,输出的就是那条灰色的路径,但是初始时边界一定要初始化一下,因为最第一列只能向上走,第一行只能向左 ...

  2. Advanced Fruits(HDU 1503 LCS变形)

    Advanced Fruits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  3. hdu 1503, LCS variants, find a LCS, not just the length, backtrack to find LCS, no extra markup 分类: hdoj 2015-07-18 16:24 139人阅读 评论(0) 收藏

    a typical variant of LCS algo. the key point here is, the dp[][] array contains enough message to de ...

  4. 题解报告:hdu 1503 Advanced Fruits(LCS加强版)

    Problem Description The company "21st Century Fruits" has specialized in creating new sort ...

  5. HDU 1503 Advanced Fruits (LCS,变形)

    题意: 给两个水果名,要求他们的LCS部分只输出1次,其他照常输出,但是必须保持原来的顺序! 思路: 求LCS是常规的,但是输出麻烦了,要先求LCS,再标记两串中的所有LCS字符,在遇到LCS字符时, ...

  6. 华为OJ:字符串合并处理

    字符串合并处理 按照指定规则对输入的字符串进行处理. 详细描述: 将输入的两个字符串合并. 对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序.这里的下标意思是字符在 ...

  7. Java实现 蓝桥杯 算法训练 字符串合并

    试题 算法训练 字符串合并 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输入两个字符串,将其合并为一个字符串后输出. 输入格式 输入两个字符串 输出格式 输出合并后的字符串 样例 ...

  8. 优化php代码 - 字符串echo输出 逗号也可作php连接符

    2016年12月12日10:00:16 ====================== 网页访问速度的提升,是可以通过代码的优化来实现的.代码的优化,并不是说代码越少越好,而是主要看代码的运行能力和执行 ...

  9. HDU 1274 展开字符串 (递归+string类)

    题目链接:HDU 1274 展开字符串 中文题. 左括号进入DFS函数,右括号return到上一层. 注意return回去的是这个一层递归中的括号中的字母串. AC代码: #include<st ...

随机推荐

  1. NOIP2018 前流水账

    不务正业系列 学习yyb,zsy,ljq,mona等大佬而写的 \(qwq\) 不知道前言写些什么 \(qwq\) 尽量日更好吧 \(qwq\) \(upd:\)日更是不可能日更的,这辈子不可能的 \ ...

  2. Python 入门基础16 -- ATM + 购物车

    ATM + 购物车 1.需求分析 2.设计程序以及程序的架构 设计程序的好处: - 扩展性强 - 逻辑清晰 3.分任务开发 4.测试 黑盒: 白盒: 对程序性能的测试 5.上线运行 # Tank -- ...

  3. Android判断当前是否在主线程

    Android开发中, 有时需要判断当前线程到底是主线程, 还是子线程, 例如: 我们在自定义View时, 想要让View重绘, 需要先判断当前线程到底是不是主线程, 然后根据判断结果来决定到底是调用 ...

  4. Java调整JVM内存大小——(八)

    JVM内存大小是有限的,有的时候程序过大时候会导致超出最大内存,产生下面异常: Exception in thread "main" java.lang.OutOfMemoryEr ...

  5. JavaScript对象复制(二)

    <script> function copy(a) { ret = {}; for (sth in a) { temp = a[sth]; if (temp instanceof Arra ...

  6. 转载 - CNN感受野(receptive-fields)RF

    本文翻译自A guide to receptive field arithmetic for Convolutional Neural Networks(可能需要FQ才能访问),方便自己学习和参考.若 ...

  7. jvm系列六、windows用jdk自带工具jps、jstack找出性能最差的代码

    一.运行程序TestGC 二.用jps找出当前应用的进程号PID 到jdk安装目录的bin目录下输入: jps -l PID为1264 三.启动Process Explorer(下载地址:https: ...

  8. 一步步实现windows版ijkplayer系列文章之五——使用automake生成makefile

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  9. win7设置固定IP

    正文: 你必须知道你的路由器网关,一般是192.168.1.1(或192.168.0.1) 按传统的来:开始——控制面板——网络和共享中心——更改适配器设置.一般来讲,这里应该有两个图标,一个是有线网 ...

  10. 从SDP中至少要看到那些东西?

    最近对通过抓包获得了很多的SDP封包,对这些SDP媒体协商过程很是好奇,为什么不同的sip终端所提供的SDP包不尽相同,为什么同一台FS对不同的sip终端发送不同的SDP? 对我菜鸟级别的我们,我分享 ...