最长公共子序列 Lcs

6人阅读 评论(0) 收藏 举报
分类:

这个解释挺容易理解的:

过程详解

 最长公共子序列Lcs

给出两个字符串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

代码如下:

需要注意的是,它是随机输出的一组最长公共子序列,以测试样例为例,如果

void LcsLength(int m,int n)
函数里的
else if(num[i - 1][j] > num[i][j - 1])
改为
else if(num[i - 1][j] >= num[i][j - 1])

那输出的就是abcb了,卡在这里好久。。。。。

心塞。

#include<iostream>
#include<cstring>
using namespace std;
char a[1002],b[1002];
int num[1002][1002];
int flag[1002][1002];
void LcsLength(int m,int n)
{
    int i,j;
    for(i = 1;i <= m;i++)
    for(j = 1;j <= n;j++)
    {
        if(a[i] == b[j])
        {
            num[i][j] = num[i - 1][j - 1] + 1;
            flag[i][j] = 1;
        }
        else if(num[i - 1][j] > num[i][j - 1])
        {
            num[i][j] = num[i - 1][j];
            flag[i][j] = 2;
        }
        else
        {
            num[i][j] = num[i][j -1];
            flag[i][j] = 3;
        }
    }
}

void Lcs(int i,int j)
{
    if(i == 0 || j == 0)
    return ;
    if(flag[i][j] == 1)
    {
        Lcs(i - 1,j - 1);
        cout << a[i];
    }
    else if(flag[i][j] == 2)
    Lcs(i - 1,j);
    else
    Lcs(i,j - 1);
}

int main()
{
    cin >> a + 1 >> b + 1;
    int m = strlen(a + 1);
    int n = strlen(b + 1);
    LcsLength(m,n);
    Lcs(m,n);
    return 0;
}
/*
Sample Input
abcicba
abdkscab
Sample Output
abca
*/


查看评论

算法导论-----最长公共子序列LCS(动态规划)

目录 一.概念梳理 二.最长公共子序列解决方案 方案1:蛮力搜索策略 方案2:动态规划策略 三、C代码实现 实现1 实现2(空间优化) 一.概念梳理  1. 子序列(subsequence): ...
  • so_geili
  • so_geili
  • 2016-12-19 22:51:07
  • 4668

递归解决最长公共子序列问题(LCS)

如何用递归解决LCS(最长公共子序列)? 什么是最长公共子序列? PS.借用了邓俊辉老师的PPT图 主要使用两种策略,也是递归中最重要的两种思想 1.减而治之 ...
  • qq799028706
  • qq799028706
  • 2017-06-10 22:41:56
  • 444

动态规划解决最长公共子序列LCS问题

子序列的定义:给定一个序列X=,另一个序列Z=,满足如下条件时称为X的子序列, 即存在一个严格递增的X的下标序列和所有的j=1,2,...,k,满足Zj=X[ik]下标序列,使得它们都相等。 如是X=...
  • liuchenjane
  • liuchenjane
  • 2016-09-22 09:53:08
  • 614

最长公共子序列(LCS)算法实验

  • 2012年04月19日 21:48
  • 28KB
  • 下载

LCS—记录,回溯输出最长公共子序列

输入 第1行:字符串A 第2行:字符串B (A,B的长度 输出 输出最长的子序列,如果有多个,随意输出1个。 输入示例 ab...
  • zwj1452267376
  • zwj1452267376
  • 2016-02-10 20:13:18
  • 1410

LCS(最长公共子序列)和dp(动态规划)

参照:v_JULY_v        最长公共子序列定义:         注意最长公共子串(Longest CommonSubstring)和最长公共子序列(LongestCommon Subs...
  • u011479875
  • u011479875
  • 2015-04-30 12:15:49
  • 1109

算法导论学习笔记(十二):动态规划(二):最长公共子序列(LCS)

LCS:给出两个序列S1和S2,求出的这两个序列的最大公共部分S3就是就是S1和S2的最长公共子序列了。公共部分 必须是以相同的顺序出现,但是不必要是连续的。 解法一:在没学动态规划之前,...
  • Bruce_Zeng
  • Bruce_Zeng
  • 2013-02-27 19:37:56
  • 6142

最长公共子序列(LCS)的C++实现

首先有如下递归式 绘制图表如下 首先我们实现最长公共子序列长度的输出,代码如下: #include #include #include #include using namespace ...
  • DrJingwuWang
  • DrJingwuWang
  • 2017-07-26 22:09:41
  • 314

Java实现算法导论中最长公共子序列(LCS)动态规划法

1、问题: 求两字符序列的最长公共字符子序列LCS 2、求解:动态规划法                      动态规划的思路就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是...
  • fjssharpsword
  • fjssharpsword
  • 2016-12-15 17:49:42
  • 2375

LCS最长公共子序列java版

这是一个动态规划问题 当其中一个串长度为0的时候子序列为0 当两个串尾字符相等时,最长子序列等于子串的最长子序列长度+1 当尾字符不等时,等于两个串的子串最大的最长子序列长度 上面是长度计算,计算...
  • Bryan__
  • Bryan__
  • 2016-07-17 00:32:54
  • 2773
    个人资料
    等级:
    访问量: 0
    积分: 78
    排名: 0
    文章分类
    文章存档
    最新评论