最长公共子序列

最长公共子序列

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 // longest common substring(Continuous)
 6 int fun(char * src, char * des)
 7 {
 8     int maxlen = 0;
 9     int dp[105][105];
10     int i,j;
11     int srclen = strlen(src);
12     int deslen = strlen(des);
13     for(i = 0; i < srclen; i++)
14         dp[i][0] = src[i] == des[0] ? maxlen = 1:0;
15     for(i = 0; i < deslen; i++)
16         dp[0][i] = des[i] == src[0] ? maxlen = 1:0;
17     for(i = 1; i < srclen; i++)
18         for(j = 1; j < deslen; j++)
19         {
20             dp[i][j] = src[i] == des[j] ? dp[i-1][j-1] + 1 : 0;
21             maxlen = dp[i][j] > maxlen ? dp[i][j] : maxlen;
22         }
23     return maxlen;
24 }
25 // longest common substring(Discontinuous)
26 // 设置墙壁好一些
27 int funno(char * src, char * des)
28 {
29     int dp[105][105];
30     int i,j;
31     int srclen = strlen(src);
32     int deslen = strlen(des);
33     for(i = 0; i < srclen; i++)
34         dp[i][0] = 0;
35     for(i = 0; i < deslen; i++)
36         dp[0][i] = 0;
37     for(i = 1; i <= srclen; i++)
38         for(j = 1; j <= deslen; j++)
39             if(src[i-1] == des[i-1])
40                 dp[i][j] = dp[i-1][j-1] + 1;
41             else
42                 dp[i][j] = dp[i-1][j] > dp[i][j-1] ? dp[i-1][j] : dp[i][j-1];
43     return dp[srclen][deslen];
44 }
45 int main()
46 {
47     char src[100];
48     char des[100];
49     while(cin >> src >> des)
50     {
51         cout << fun(src, des) << endl;
52         cout << funno(src, des) << endl;
53     }
54     return 0;
55 }

分析问题啊。

posted @ 2012-10-22 10:15  可乐爱上了雪碧  阅读(130)  评论(0编辑  收藏  举报