最长公共子列:
输入:
Abcfbc abfcab
Programming contest
Abcd mnp
输出:
4
2
0
解题思路:
和最求最长上升子列一样,先设定一个数组存储比较过的状态maxlen[][],一步步的从子问题推到最终问题。
设一个二维数组maxlen[][]
最长公共子串 |
a |
d |
c |
b |
a |
1 |
1 |
1 |
1 |
b |
1 |
1 |
1 |
2 |
c |
1 |
1 |
2 |
2 |
d |
1 |
2 |
2 |
1 |
取一个子串内的字母,和另一个子串依次比较
代码如下

1 #include<iostream>
2 #include<algorithm>
3 #include<cstring>
4 using namespace std;
5 char s1[1000],s2[1000];//两个字符数组
6 int maxlen[1000][1000];//计数数组
7
8 int main()
9 {
10 int i,j;
11 while(cin>>s1>>s2)//输入两个数组,作为开始
12 {
13 int m = strlen(s1);
14 int n = strlen(s2);
15
16 //表格初始化
17 for(i=1;i<=m;i++)
18 maxlen[i][0]=0;
19 for(j=1;j<=n;j++)
20 maxlen[0][j]=0;
21
22 //取一个数组,一个个的跟另一个数组从头到尾比较
23 for(i=1;i<=m;i++)
24 {
25 for(j=1;j<=n;j++)
26 if(s1[i]==s2[j])
27 maxlen[i][j]=maxlen[i-1][j-1]+1;
28 else
29 maxlen[i][j]=max(maxlen[i-1][j],maxlen[i][j-1]);
30
31 }
32
33 cout<<maxlen[m][n];
34 }
35
36
37
38
39
40
41 return 0;
42 }
43