链接:https://leetcode-cn.com/problems/longest-common-subsequence/
比较经典的DP问题。创建二维数组
d
p
dp
dp,
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]表示
t
e
x
t
(
0
,
i
)
text(0,i)
text(0,i)与
t
e
x
t
2
(
0
,
j
)
text2(0,j)
text2(0,j)的最长公共子序列。
转移方程为:
1. 当
t
e
x
t
1
[
i
]
=
=
t
e
x
t
2
[
j
]
text1[i] == text2[j]
text1[i]==text2[j]时,
d
p
[
i
+
1
]
[
j
+
1
]
=
d
p
[
i
]
[
j
]
+
1
dp[i+1][j+1] = dp[i][j]+1
dp[i+1][j+1]=dp[i][j]+1
2. 当
t
e
x
t
1
[
i
]
!
=
t
e
x
t
2
[
j
]
text1[i] != text2[j]
text1[i]!=text2[j]时,
d
p
[
i
+
1
]
[
j
+
1
]
=
m
a
x
(
d
p
[
i
]
[
j
+
1
]
,
d
p
[
i
+
1
]
[
j
]
)
dp[i+1][j+1] = max(dp[i][j+1],dp[i+1][j])
dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j])
java代码:
class Solution {
public int longestCommonSubsequence(String text1, String text2) {
int len1 = text1.length();
int len2 = text2.length();
int dp[][] = new int [len1+1][len2+1];
for(int i = 0;i<len1;i++)
{
for(int j = 0;j<len2;j++)
{
if(text1.charAt(i) == text2.charAt(j))
dp[i+1][j+1] = dp[i][j]+1;
else
dp[i+1][j+1] = Math.max(dp[i][j+1],dp[i+1][j]);
}
}
return dp[len1][len2];
}
}