概述
LCS算法
Longest Common Sequence
假设存在两个字符串序列 X 和 Y
X = { x 1 , x 2 , . . . , x n } X = {x_1, x_2, ..., x_n} X={x1,x2,...,xn}
Y = { y 1 , y 2 , . . . , y n } Y = {y_1, y_2, ..., y_n} Y={y1,y2,...,yn}
考虑两个序列最后一个元素是否相等,可以得到
L
C
S
(
x
n
,
y
m
)
=
{
L
C
S
(
x
n
−
1
,
y
m
−
1
)
+
1
,
x
n
=
y
m
m
a
x
(
L
C
S
(
x
n
−
1
,
y
m
)
,
L
C
S
(
x
n
,
y
m
−
1
)
)
,
x
n
!
=
y
m
LCS(x_n, y_m) = begin{cases} LCS(x_{n-1}, y_{m-1})+1 quad , x_n = y_m\ max(LCS(x_{n-1}, y_m), LCS(x_n, y_{m-1})) quad ,x_n != y_m\ end{cases}
LCS(xn,ym)={LCS(xn−1, ym−1)+1,xn=ymmax(LCS(xn−1,ym), LCS(xn,ym−1)),xn!=ym
同时考虑到当字串为0的时候就不存在相等元素,完善递推式
L
C
S
(
x
n
,
y
m
)
=
{
0
,
n
=
0
o
r
m
=
0
L
C
S
(
x
n
−
1
,
y
m
−
1
)
+
1
,
x
n
=
y
m
m
a
x
(
L
C
S
(
x
n
−
1
,
y
m
)
,
L
C
S
(
x
n
,
y
m
−
1
)
)
,
x
n
!
=
y
m
LCS(x_n, y_m) = begin{cases} 0 quad ,n = 0 or m = 0 \ LCS(x_{n-1}, y_{m-1})+1 quad , x_n = y_m\ max(LCS(x_{n-1}, y_m), LCS(x_n, y_{m-1})) quad ,x_n != y_m\ end{cases}
LCS(xn,ym)=⎩⎪⎨⎪⎧0,n=0 or m=0LCS(xn−1, ym−1)+1,xn=ymmax(LCS(xn−1,ym), LCS(xn,ym−1)),xn!=ym
递推式即为dp方程。
递推的过程是把一个大问题转化成子问题,同时我们在写dp程序的时候要明白一点 任何大问题转化成子问题的前提是子问题已经得解,从而反推到大问题解决!!!,所以实际上这个递推式转化成方程就是当任一字符串长度为0的时候,无元素相同,即为dp[0][0] = 0 dp[0][1] = 0dp[1][0] = 0 , 然后就可以通过递推式求其他情况的答案了。
// LCS典型题
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
const int N = 1e4 + 10;
int dp[N][N];
int main() {
string a, b;
getline(cin, a);
getline(cin, b);
for (int i = 1; i <= a.length(); i++) {
for (int j = 1; j <= b.length(); j++) {
if (a[i - 1] == b[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
cout << dp[a.length()][b.length()] << endl;
return 0;
}
这里构造dp数组直接空出两行,表示任意一个序列长度为0的时候,无相同字符,对应位置数字为0
最后
以上就是香蕉摩托为你收集整理的LCS算法(Longest Common Sequence)的全部内容,希望文章能够帮你解决LCS算法(Longest Common Sequence)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复