最长公共子序列

 

很久之前就有研究这个算法

结果忘记上传了     哈哈

前天看到好多同学需要这个算法   

所以 来吧   写一写

 

先来看下  什么是公共子序列    

我直接来一张图 相信大家就明白了     当然  图片是百度到的 

 

 

 涂色部分就是  公共子序列   

 

 

OK  相信到这里 大家对什么是子序列    有了一定的概念     

记住  子序列和  子串不是同一个概念

那么  我们今天的问题就来了  

最长的公共子序列   怎么来找呢   

是不是有点懵

 

废话不说  

先上代码

 

 

//

//  main.c

//  most

//

//  Created by 陈昌明 on 2020/4/11.

//  Copyright © 2020 陈昌明. All rights reserved.

//

 

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

int aa,bb;//记录长度

int max(int a,int b)

{

    if(a>b)

    {

        return a;

    }

    return b;

}

int Max(char a[],char b[])

{

    int M=0;

    int n1=(int)strlen(a);

    int n2=(int)strlen(b);

    if(n1>0 && n2>0)

    {

        if(*a==*b)

        {

            M=1+Max(++a,b);

        }

        else

        {

            if((n1>=1 && n1>=0) || (n2>=1 && n2>=0) )//是否还能继续 当然 也是结束条件

            M=M+max(Max(a+1,b),Max(a,b+1));//动态规划

        }

    }

    return M;

}

int main()

{

    char a[100];

    char b[100];

    scanf("%s",a);

    scanf("%s",b);

    aa=(int)strlen(a);

    bb=(int)strlen(b);

    int Mmax=Max(a,b);

    printf("%d\n",Mmax);

    return 0;

}

 

 

这个版本应该是通用的 

前面由于编译器的问题   转型有点问题  

现在已近改进    应该可以适应所有的编译器

 

 

OK   少说废话  

来讲题 

 

 

为了方便大家理解  

我去拷贝了 大佬总结的公式    

 

 

 

现在我们来过一遍这个公式   型芯大家就有点了解了

 

我们只讲动态规划的一节  因为节节都是同一个道理 

X Y  为两个字符串    m  n   分别指长度

 

就是  当两个字符串的当前字符相同时  同时 移动一位 然后得到的结果即长度相加

当当前的两个不同时   就要考虑 第一个字符串移动后一个不移动 和反过来的两种情况的最大值

 

OK  现在思路应该明白      不明白的再去悟悟公式   可以随便弄几个简单的字符串试验一下   

 

当然上面的代码自身  输出的长度   

其实也是可以得到字符串的

这里就不实现了 

 

不过建议用java 试着实现以下    (java 的话会方便一丢丢  个人感觉)

 

OK 今天就到这

谢谢大家

   

 

posted @ 2020-04-11 09:28  Mr小明同学  阅读(170)  评论(0编辑  收藏  举报