这篇日志主要为了记录这几天的学习成果。

最长公共子序列根据要不要求子序列连续分两种情况。

只考虑两个串的情况,假设两个串长度均为n.

一,子序列不要求连续。

(1)动态规划(O(n*n))

(转自:http://www.cnblogs.com/xudong-bupt/archive/2013/03/15/2959039.html

    动态规划采用二维数组来标识中间计算结果,避免重复的计算来提高效率。

    1)最长公共子序列的长度的动态规划方程

    设有字符串a[0...n],b[0...m],下面就是递推公式。字符串a对应的是二维数组num的行,字符串b对应的是二维数组num的列。

    LCS最长公共子序列(最优线性时间O(n))

    另外,采用二维数组flag来记录下标ij的走向。数字"1"表示,斜向下;数字"2"表示,水平向右;数字"3"表示,竖直向下。这样便于以后的求解最长公共子序列。

代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 
 4 char a[500],b[500];
 5 char num[501][501]; ///记录中间结果的数组
 6 char flag[501][501];    ///标记数组,用于标识下标的走向,构造出公共子序列
 7 void LCS(); ///动态规划求解
 8 void getLCS();    ///采用倒推方式求最长公共子序列
 9 
10 int main()
11 {
12     int i;
13     strcpy(a,"ABCBDAB");
14     strcpy(b,"BDCABA");
15     memset(num,0,sizeof(num));
16     memset(flag,0,sizeof(flag));
17     LCS();
18     printf("%d\n",num[strlen(a)][strlen(b)]);
19     getLCS();
20     return 0;
21 }
22 
23 void LCS()
24 {
25     int i,j;
26     for(i=1;i<=strlen(a);i++)
27     {
28         for(j=1;j<=strlen(b);j++)
29         {
30             if(a[i-1]==b[j-1])   ///注意这里的下标是i-1与j-1
31             {
32                 num[i][j]=num[i-1][j-1]+1;
33                 flag[i][j]=1;  ///斜向下标记
34             }
35             else if(num[i][j-1]>num[i-1][j])
36             {
37                 num[i][j]=num[i][j-1];
38                 flag[i][j]=2;  ///向右标记
39             }
40             else
41             {
42                 num[i][j]=num[i-1][j];
43                 flag[i][j]=3;  ///向下标记
44             }
45         }
46     }
47 }
48 
49 void getLCS()
50 {
51 
52     char res[500];
53     int i=strlen(a);
54     int j=strlen(b);
55     int k=0;    ///用于保存结果的数组标志位
56     while(i>0 && j>0)
57     {
58         if(flag[i][j]==1)   ///如果是斜向下标记
59         {
60             res[k]=a[i-1];
61             k++;
62             i--;
63             j--;
64         }
65         else if(flag[i][j]==2)  ///如果是斜向右标记
66             j--;
67         else if(flag[i][j]==3)  ///如果是斜向下标记
68             i--;
69     }
70 
71     for(i=k-1;i>=0;i--)
72         printf("%c",res[i]);
73 }
View Code

相关文章:

  • 2021-06-18
  • 2022-02-10
  • 2021-09-22
  • 2021-06-18
猜你喜欢
  • 2021-05-20
  • 2021-04-09
  • 2022-01-24
  • 2022-01-20
  • 2021-09-14
相关资源
相似解决方案