最长公共子序列简单实现

int LCS(string str1, string str2)  //返回最长公共字串长度
{
    //创建矩阵
    int** martix;
    martix = new int*[str1.length()+1];
    for(int i =0; i<=str1.length(); i++)
    {
        martix[i] = new int[str2.length()+1];
    }
    //初始化矩阵
    for (int i = 0; i <= str1.length(); i++)   martix[i][0] = 0;
    for (int j = 0; j <= str2.length(); j++)   martix[0][j] = 0;
    //填充矩阵
    for (int i = 1; i <= str1.length(); i++)
    {
        for (int j = 1; j <= str2.length(); j++)
        {
            if (str1[i-1] == str2[j-1])
            {
                martix[i][j] = martix[i-1][j-1] + 1;
            }
            else
            {
                martix[i][j]=0;
            }
        }
    }
    //找到最大处即最长处
    int max(0),imax(0),jmax(0);
    for (int i = 0; i <= str1.length(); i++)
    {
        for (int j = 0; j <= str2.length(); j++)
        {
            if(martix[i][j]>max)
            {
                max = martix[i][j];
                imax = i;
                jmax = j;
            }
        }
    }
    cout<<"最长公共字串长度为:"<<max<<endl;
    cout<<"最长公共字串为:";
    for(int i = max; i>0; i--)
    {
        cout<<str1[imax-i];
    }
    cout<<endl;
    for(int i =0; i<=str1.length(); i++)
    {
        delete[] martix[i];
    }
    delete[] martix;
    return max;
}
时间: 2024-11-02 13:43:19

最长公共子序列简单实现的相关文章

简单Dp----最长公共子序列,DAG最长路,简单区间DP等

/* uva 111 * 题意: * 顺序有变化的最长公共子序列: * 模板: */ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int a[100]; int mu[100]; int Dp[100][100]; int main() { int n,x; scanf("%d", &n

(hdu step 3.2.2)Common Subsequence(简单dp:求最长公共子序列的长度)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 976 Accepted Submission(s): 538   Probl

最长公共子序列 nlogn

先来个板子 #include<bits/stdc++.h> using namespace std; const int N = 1e6+20, M = 1e6+10, mod = 1e9+7, inf = 1e9+1000; typedef long long ll; struct node { int c; int num; } u[N]; int i,j,k = 0,n,m,x,y = 0,T = 0,ans = 0,big = 0,cas = 0,num = 0,len = 0; bo

算法学习 - 最长公共子序列(LCS)C++实现

最长公共子序列 最长公共子序列的问题很简单,就是在两个字符串中找到最长的子序列,这里明确两个含义: 子串:表示连续的一串字符 . 子序列:表示不连续的一串字符. 所以这里要查找的是不连续的最长子序列, 动态规划 这里为什么要使用动态规划可以说一下,简单来说动态规划是为了降低时间复杂度的一种算法,申请一个额外空间,来保存每一个步骤的结果,最后从这些结果中找到最优的解. 这里有个问题就是:一般来说,当前的最优解,只与当前时刻和上一时刻有关系,和其他时刻没有关系,这样才能让动态规划发生作用,降低复杂度

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

tips : 本文内容是参考了很多著名博客和自己的思考得出的,如有不当欢迎拍砖. 先简单说一下动态规划 通俗地说:动态规划就是将一个可以划分为子问题的问题进行递归求解,不过动态规划将大量的中间结果保存起来, 不管它们是否会用得到,从而在后面的递归求解过程中可以快速求解.由此可以看得出来动态规划是一个以牺牲空间 为代价换取时间的算法. 对于最长公共子序列的题目不用多说,现在来分析一下LCS的动态规划解决思路: 一.首先先观察问题是否符合动态规划最明显的两个特征:最优子结构和重叠子问题 方便起见,以

动态规划法——最长公共子序列问题

这个题当初始终看不下去的原因就是当初误解了什么叫最长公共子序列,还一度以为这个题有问题,其实如果明白了什么叫最长公共子序列,也就解决了一半的问题. 什么是最长公共子序列? 什么是最长公共子序列呢?举个简单的例子吧,一个数列S,若分别是两个或多个已知序列的子序列,且是所有符合条件序列中最长的,则S称为已知序列的最长公共子序列. 注意区别: 最长公共子串和最长公共子序列 最长公共子串(Longest Common Substirng)和最长公共子序列(Longest Common Subsequen

最长公共子序列(LCS)

最长公共子序列,英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列.而最长公共子串(要求连续)和最长公共子序列是不同的.       最长公共子序列是一个十分实用的问题,它可以描述两段文字之间的"相似度",即它们的雷同程度,从而能够用来辨别抄袭.对一段文字进行修改之后,计算改动前后文字的最长公共子序列,将除此子序列外的部分提取出来,

最长公共子序列(仅借助数组dp本身在O(m+n)时间内构造最长公共子序列)

算法课上机作业,想复杂了.. 给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列. 改进LCS函数,不使用数组b而仅借助数组c本身在O(m+n)时间内构造最长公共子序列. 原来的代码: void LCSLength(char *x ,char *y,int m,int n, int **c, int **b) {        int i ,j;        for (i = 1; i <= m; i++) c[i][0] = 0;       

最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和

参考:http://www.ahathinking.com/archives/124.html 最长公共子序列 1.动态规划解决过程 1)描述一个最长公共子序列 如果序列比较短,可以采用蛮力法枚举出X的所有子序列,然后检查是否是Y的子序列,并记录所发现的最长子序列.如果序列比较长,这种方法需要指数级时间,不切实际. LCS的最优子结构定理:设X={x1,x2,……,xm}和Y={y1,y2,……,yn}为两个序列,并设Z={z1.z2.……,zk}为X和Y的任意一个LCS,则: (1)如果xm=