码迷,mamicode.com
首页 > 其他好文 > 详细

1006 最长公共子序列Lcs

时间:2017-08-03 11:11:07      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:字符   blog   ++   地址   fine   最大   依次   clu   利用   

给出两个字符串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\n", R + k + 1);//算好存入的长度,从第一个地址开始输出。
37     return 0;
38 }

1006 最长公共子序列Lcs

标签:字符   blog   ++   地址   fine   最大   依次   clu   利用   

原文地址:http://www.cnblogs.com/zllwxm123/p/7278218.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!