zoukankan      html  css  js  c++  java
  • 1006 最长公共子序列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

    一开始用动态规划来算出有多长,然后从最后回朔,依次判断。
     1 #include <stdio.h>
     2 #define  MAXN  1002
     3 char A[MAXN] = {0};
     4 char B[MAXN] = {0};
     5 char R[MAXN] = {0};
     6 short mat[MAXN][MAXN] = {0};
     7 //返回三个数的最大值
     8 short max(short a, short b, short c) {
     9     if (a > b) {
    10         b = a;
    11     }
    12     return b > c ? b : c;
    13 }
    14 int main() {
    15     int i, j = 0, k;
    16     scanf("%s %s", A + 1, B + 1);
    17     for (i = 1; A[i]; i++) {
    18         for (j = 1; B[j]; j++) {//利用动态规划算出最长公共子序列
    19             mat[i][j] = max(mat[i - 1][j], mat[i][j - 1], mat[i - 1][j - 1] + (A[i] == B[j] ? 1 : 0));
    20         }
    21     }
    22     i--;
    23     j--;
    24     k = MAXN - 1;
    25     while (i > 0 && j > 0) {//从后往前回朔,相等则倒序存入一个字符数组中。
    26         if (A[i] == B[j]) {
    27             R[k--] = A[i];
    28             i--;
    29             j--;
    30         } else if (mat[i - 1][j] > mat[i][j - 1]) {
    31             i--;
    32         } else {
    33             j--;
    34         }
    35     }
    36     printf("%s
    ", R + k + 1);//算好存入的长度,从第一个地址开始输出。
    37     return 0;
    38 }
  • 相关阅读:
    http简记
    socket简介
    iOS代理
    ai作图小技能
    按钮切换
    关于ie8背景图片的平铺
    关于文本省略
    关于html table样式
    阿里巴巴iconfont使用方法(超级详细)
    办公电脑安装虚拟机基本就绪
  • 原文地址:https://www.cnblogs.com/zllwxm123/p/7278218.html
Copyright © 2011-2022 走看看