首页 > 其他 > 详细

51Nod 1006 最长公共子序列Lcs

时间:2017-07-26 10:17:39      阅读:254      评论:0      收藏:0      [点我收藏+]
给出两个字符串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 short max(short a, short b, short c)
 8 {
 9     if(a > b){
10         b = a;
11     }
12     return  b > c ? b : c;
13 }
14 int main()
15 {
16     int  i, j = 0, k;
17     scanf("%s %s", A + 1, B + 1);
18     for(i = 1; A[i]; i++){
19         for(j = 1; B[j]; j++){
20             mat[i][j] = max(mat[i-1][j], mat[i][j-1], mat[i-1][j-1] + (A[i]==B[j] ? 1 : 0));
21         }
22     }
23     i--;
24     j--;
25     k = MAXN - 1;
26     while(i > 0 && j > 0){
27         if(A[i] == B[j]){
28             R[k--] = A[i];
29             i--;
30             j--;
31         }
32         else if(mat[i-1][j] > mat[i][j-1]){
33             i--;
34         }
35         else{
36             j--;
37         }
38     }
39     printf( "%s\n", R + k + 1);
40     return 0;
41 }

 

51Nod 1006 最长公共子序列Lcs

原文:http://www.cnblogs.com/shixinzei/p/7238064.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!