zoukankan      html  css  js  c++  java
  • 最长子序列

    /*在做OJ题目的时候,经常会用到字符串的处理。例如,比较二个字符串相似度。这篇文章介绍一下求两个字符串的最长公共子序列。
    
      一个字符串的子序列,是指从该字符串中去掉任意多个字符后剩下的字符在不改变顺序的情况下组成的新字符串。
    
      最长公共子序列,是指多个字符串可具有的长度最大的公共的子序列。*/
    
    
    #include<stdio.h>
    #include<string.h>
    
    char a[500],b[500];
    char num[501][501]; ///记录中间结果的数组
    char flag[501][501];    ///标记数组,用于标识下标的走向,构造出公共子序列
    void LCS(); ///动态规划求解
    void getLCS();    ///采用倒推方式求最长公共子序列
    
    int main()
    {
        int i;
        strcpy(a,"ABCBDAB");
        strcpy(b,"BDCABA");
        memset(num,0,sizeof(num));
        memset(flag,0,sizeof(flag));
        LCS();
        printf("%d
    ",num[strlen(a)][strlen(b)]);
        getLCS();
        return 0;
    }
    
    void LCS()
    {
        int i,j;
        for(i=1;i<=strlen(a);i++)
        {
            for(j=1;j<=strlen(b);j++)
            {
                if(a[i-1]==b[j-1])   ///注意这里的下标是i-1与j-1
                {
                    num[i][j]=num[i-1][j-1]+1;
                    flag[i][j]=1;  ///斜向下标记
                }
                else if(num[i][j-1]>num[i-1][j])
                {
                    num[i][j]=num[i][j-1];
                    flag[i][j]=2;  ///向右标记
                }
                else
                {
                    num[i][j]=num[i-1][j];
                    flag[i][j]=3;  ///向下标记
                }
            }
        }
    }
    
    void getLCS()
    {
    
        char res[500];
        int i=strlen(a);
        int j=strlen(b);
        int k=0;    ///用于保存结果的数组标志位
        while(i>0 && j>0)
        {
            if(flag[i][j]==1)   ///如果是斜向下标记
            {
                res[k]=a[i-1];
                k++;
                i--;
                j--;
            }
            else if(flag[i][j]==2)  ///如果是斜向右标记
                j--;
            else if(flag[i][j]==3)  ///如果是斜向下标记
                i--;
        }
    
        for(i=k-1;i>=0;i--)
            printf("%c",res[i]);
    }



  • 相关阅读:
    Windows环境下阿里云添加SSH Key及Git配置Key
    Shiro自定义注解扩展@SalmonRequiresPermission
    windows下安装redis
    模型-视图-控制器的C++解释
    CentOS 7 搭建 GitLab
    博客园主题分享——绿色
    2019年的第一篇博客
    Qt——线程与定时器
    Qt——线程类QThread
    QML——添加自定义模块
  • 原文地址:https://www.cnblogs.com/Tovi/p/6194853.html
Copyright © 2011-2022 走看看