我们令s和p分别为两串字符串
那么状态转移方程可写为
i
f
(
s
[
i
]
=
p
[
i
]
)
d
p
[
i
]
[
j
]
=
d
p
[
i
−
1
]
[
j
−
1
]
+
1
e
l
s
e
d
p
[
i
]
[
j
]
=
m
a
x
(
d
p
[
i
−
1
]
[
j
]
,
d
p
[
i
]
[
j
−
1
]
)
if(s[i]=p[i]) \ \ dp[i][j] = dp[i-1][j-1]+1 \\ else \ \ dp[i][j] = max(dp[i-1][j],dp[i][j-1])
if(s[i]=p[i]) dp[i][j]=dp[i−1][j−1]+1else dp[i][j]=max(dp[i−1][j],dp[i][j−1])
其中
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]代表s前缀长度为i且p的前缀长度为j时的LCS
代码实现:
for(int i = 1;i < = len_s;i++)
for(int j = 1;j<=len_p;j++)
{
if(s[i]=p[i]) dp[i][j] = dp[i-1][j-1]+1;
else dp[i][j] = max(dp[i-1][j],dp[j-1][i])
}