基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
 收藏
 关注
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。

比如两个串为:

abcicba
abdkscab

ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
Input
第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)
Output
输出最长的子序列,如果有多个,随意输出1个。
Input示例
abcicba
abdkscab
Output示例
abca
解体思路:
先跑LCS,注意开始的下标。多出来一行一列。其实不用flag[][]数组标记位置,回溯的时候再判断,这道
题也能做,但容易超时,因为需要重新比较,方向也不能完全确定。所以以空间换时间,开辟新的数组
标记,分为3个不同的方向来源,1代表左上,2代表正上,3代表正左,这样倒推求序列的时候方向就
能够唯一确定下来,减少了不必要的比较计算和重新探索。

源代码:
<span style="font-size:18px;">#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<cstring>
#include<string>
using namespace std; char a[1005];
char b[1005];
char c[1005];//用来保存结果
int dp[1005][1005];
int flag[1005][1005];
int index; void LCS(int len_a, int len_b)
{
memset(dp,0,sizeof(dp));
memset(flag,0,sizeof(flag));
int i,j;
for(i = 1; i <= len_a; i++)
{
for(j = 1; j <= len_b; j++)
{
if(a[i - 1] == b[j - 1])
{
dp[i][j] = dp[i - 1][j - 1] +1;
flag[i][j] = 1;
}
else if(dp[i][j - 1] > dp[i - 1][j])
{
dp[i][j] = dp[i][j - 1];
flag[i][j] = 2;
}
else
{
dp[i][j] = dp[i - 1][j];
flag[i][j] = 3;
}
}
}
} void getLCS(int n, int m)
{
while(n>0&&m>0)
{
if(flag[n][m] == 1)
{
c[index++] = a[n - 1];
n--;
m--;
}
else if(flag[n][m] == 2)
{
m--;
}
else if(flag[n][m] == 3)
{
n--;
}
}
}
void printLCS()
{
int i;
for(i = index - 1; i >= 0; i--)
printf("%c",c[i]);
printf("\n");
} int main()
{
int len_a,len_b;
scanf("%s%s",a,b);
len_a = strlen(a);
len_b = strlen(b);
LCS(len_a, len_b);
index = 0;//结果的下标
getLCS(len_a, len_b);
printLCS();
return 0;
}
</span>

最新文章

  1. linux——常用命令与脚本
  2. BZOJ 2460 [BeiJing2011]元素 ——线性基
  3. PHP日常开发工具-Sublime应用
  4. Mac &gt; MacBook Pro的移动硬盘方案
  5. 全文检索引擎Solr系列——整合MySQL、MongoDB
  6. iOS,图片处理
  7. WPF的消息机制
  8. Activity猫的一生-故事讲解Activity生命周期
  9. dijkstra最小花费
  10. jQuery实现动态分割div
  11. 图解Redis之数据结构篇——字典
  12. 当x,y和theta都是向量的时候如何计算损失
  13. git合并多个提交
  14. mysql 中 replace into 与 insert into on duplicate key update 的使用和不同点
  15. 视频剪辑软件-PR (Adobe Premiere)
  16. BaaS后端即服务 - 概念篇
  17. csu1510 Happy Robot 递推
  18. 170605、防止sql注入(二)
  19. Cocoa Touch提供了哪几种Core Animation过渡类型?
  20. Docker、DAOCloud

热门文章

  1. java web 入门级 开发 常用页面调试方法
  2. C11 constant expressions 常量表达式
  3. js 判断通过什么打开(安卓、苹果、微信、QQ、浏览器、某个app应用…)
  4. 微信公众号开发(十二)OAuth2.0网页授权
  5. spring boot 自己输出json数据
  6. What Are You Talking About
  7. mongodb集群【】
  8. SpringMVC知识一锅烩
  9. 使用jquery ajaxForm提交表单
  10. python迭代器以及itertools模块