(1 ) 如果am-1=bn-1 ,则zk-1=am-1=bn-1 ,且“z0 ,z1 ,…,zk-2”是“a0 ,a1 ,…,am-2”和“b0 ,b1 ,…,bn-2”的一个最长公共子序列;
(2 ) 如果am-1!=bn-1 ,则若zk-1!=am-1 ,蕴涵“z0 ,z1 ,…,zk-1”是“a0 ,a1 ,…,am-2”和“b0 ,b1 ,…,bn-1”的一个最长公共子序列;
(3 ) 如果am-1!=bn-1 ,则若zk-1!=bn-1 ,蕴涵“z0 ,z1 ,…,zk-1”是“a0 ,a1 ,…,am-1”和“b0 ,b1 ,…,bn-2”的一个最长公共子序列。
求解:
引进一个二维数组c[][],用c[i][j]记录X[i]与Y[j] 的LCS
的长度,b[i][j]记录c[i][j]是通过哪一个子问题的值求得的,以决定搜索的方向。
我们是自底向上进行递推计算,那么在计算c[i,j]之前,c[i-1][j-1],c[i-1][j]与c[i][j-1]均已计算出来。此时我们根据X[i]
= Y[j]还是X[i] != Y[j],就可以计算出c[i][j]。
#include
<
stdio.h
>
#include
<
string
.h
>
#define
MAXLEN 100
void
LCSLength(
char
*
x,
char
*
y,
int
m,
int
n,
int
c[][MAXLEN],
int
b[][MAXLEN])
{
int
i, j;
for
(i
=
0
; i
<=
m; i
++
)
c[i][
0
]
=
0
;
for
(j
=
1
; j
<=
n; j
++
)
c[
0
][j]
=
0
;
for
(i
=
1
; i
<=
m; i
++
)
{
for
(j
=
1
; j
<=
n; j
++
)
{
if
(x[i
-
1
]
==
y[j
-
1
])
{
c[i][j]
=
c[i
-
1
][j
-
1
]
+
1
;
b[i][j]
=
0
;
}
else
if
(c[i
-
1
][j]
>=
c[i][j
-
1
])
{
c[i][j]
=
c[i
-
1
][j];
b[i][j]
=
1
;
}
else
{
c[i][j]
=
c[i][j
-
1
];
b[i][j]
=
-
1
;
}
}
}
}
void
PrintLCS(
int
b[][MAXLEN],
char
*
x,
int
i,
int
j)
{
if
(i
==
0
||
j
==
0
)
return
;
if
(b[i][j]
==
0
)
{
PrintLCS(b, x, i
-
1
, j
-
1
);
printf(
"
%c
"
, x[i
-
1
]);
}
else
if
(b[i][j]
==
1
)
PrintLCS(b, x, i
-
1
, j);
else
PrintLCS(b, x, i, j
-
1
);
}
int
main(
int
argc,
char
**
argv)
{
char
x[MAXLEN]
=
{
"
ABCBDAB
"
}
;
char
y[MAXLEN]
=
{
"
BDCABA
"
}
;
int
b[MAXLEN][MAXLEN];
int
c[MAXLEN][MAXLEN];
int
m, n;
m
=
strlen(x);
n
=
strlen(y);
LCSLength(x, y, m, n, c, b);
PrintLCS(b, x, m, n);
return
0
;
}
#include <iostream> #include <string> using namespace std; int f(string s1,string s2) { int len1=s1.size(); int max_length=0; for( int i=0;i<len1-1;i++) for( int j=i+1;j<len1;j++) { string s=s1.substr(i,j-i+1); int index=s2.find(s); if(index!=-1) { //cout<<s<<endl; if( s.size()>max_length ) max_length=s.size(); } } return max_length; } int main() { string s1="acbac"; string s2="acaccbabb"; cout<<f(s1,s2); return 0; }
#include<iostream>
public String getCommonSubSeq(String str1, String str2) { char[] array1 = str1.toCharArray(); char[] array2 = str2.toCharArray(); int max = 0,x = 0,y = 0; int length1 = array1.length; int length2 = array2.length; int[][] array = new int[length1+1][length2+1]; for( int i = 0; i < length1; i++ ){ for( int j = 0; j < length2; j++ ){ if( array1[i] == array2[j] ){ array[i+1][j+1] = array[i][j] + 1; if( array[i+1][j+1] > max ){ max = array[i+1][j+1]; x = i; y = j; } } else { array[i+1][j+1] = 0; } } } StringBuilder mSB = new StringBuilder(); for( int i = max - 1; i >= 0; i-- ){ mSB.append(array1[x-i]); } return mSB.toString(); }