zoukankan      html  css  js  c++  java
  • 最长公共子序列的长度

    最长公共子序列的长度

    【试题描述】

            给定两个字符串 str1 和 str2 ,如果将 str1 去掉一些字符后得到字符串str,将str2去掉一些字符后也能得到字符串 str ,我们就说 str 是 str1 和 str2 的一个公共子串。当然在得到str的时候不能改变字符的相对顺序。请你编写程序求出字符串 str 长度的最大值。

    【输入要求】

    两行,每行一个只含英文字母的字符串

    【输出要求】

    一个数,表示两个字符串的最长公共子串的长度

    【输入实例】

    ABCEF
    BMCGUAFB
    

      

    【输出实例】

    3
    

      

    【其他说明】

    输入的字符串长度均不超过1000

    【试题分析】

        很简单的动态规划,把这两个序列两层循环分段,定义一个数组f[i][j],表示第一个序列第i个字符与第二个序列的第j个字符的最长公共子序列,如果最后一个字符一样的话,这最后一个字符相当于是有效的,所以第一个序列第i+1个字符与第二个序列的第j+1个字符的最长公共子序列就是第一个序列第i个字符与第二个序列的第j个字符的最长公共子序列长度+1,否则就是max(第一个序列第i个字符与第二个序列的第j+1个字符的最长公共子序列,第一个序列第i+1个字符与第二个序列的第j个字符的最长公共子序列),所以转移方程就是:

      if(a[i]!=b[j]) f[i+1][j+1]=max{

                                               f[i+1][j],f[i][j+1]

                                         };

      else f[i+1][j+1]=f[i][j]+1;

    【代码】

    # include<stdio.h>
    # include<string.h>
    # define N 1000
    int str[N+2][N+2];
    int main()
    {
        int i,j,la,lb;
        char str1[N+1],str2[N+1];
        while(scanf("%s%s",str1,str2)!=EOF)
        {
             la=strlen(str1);
             lb=strlen(str2);
             for(i=0;i<=la;i++) str[0][i]=0;
             for(j=0;j<=lb;j++) str[j][0]=0;
             for(j=0;j<la;j++)//枚举断点
                 for(i=0;i<lb;i++)
                 {
                      if(str1[j]==str2[i]) str[i+1][j+1]=str[i][j]+1;
                      else str[i+1][j+1]=max(str[i][j+1],str[i+1][j]);
                 }
              printf("%d/n",str[lb][la]);
        }
         return 0;
    }
  • 相关阅读:
    skywalking学习
    logstash使用
    AIO编程
    NIO编程
    NIO入门之BIO
    Akka Cluster之集群分片
    Akka Stream之Graph
    【Swift学习笔记-《PRODUCT》读书记录-实现自定义转场动画】
    CoreData 数据模型文件导出NSManagedObject时重复问题
    iOS图片压缩
  • 原文地址:https://www.cnblogs.com/wxjor/p/5619611.html
Copyright © 2011-2022 走看看