题目:1143. 最长公共子序列
思路:动态规划dp,时间复杂度0(n)。
状态f[i][j]:表示在text1[0,i-1]和text1[0,j-1]之间的最长公共子序列的长度。
C++版本:
class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
int n=text1.size(),m=text2.size();
vector<vector<int>> f(n+1,vector<int>(m+1,0));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(text1[i]==text2[j]){
f[i+1][j+1]=f[i][j]+1;
}
f[i+1][j+1]=max(f[i+1][j+1],f[i+1][j]);
f[i+1][j+1]=max(f[i+1][j+1],f[i][j+1]);
f[i+1][j+1]=max(f[i+1][j+1],f[i][j]);
}
}
return f[n][m];
}
};
JAVA版本:
class Solution {
public int longestCommonSubsequence(String text1, String text2) {
int n=text1.length(),m=text2.length();
int[][] f=new int[n+1][m+1];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(text1.charAt(i)==text2.charAt(j)){
f[i+1][j+1]=f[i][j]+1;
}
f[i+1][j+1]=Math.max(f[i+1][j+1],f[i+1][j]);
f[i+1][j+1]=Math.max(f[i+1][j+1],f[i][j+1]);
f[i+1][j+1]=Math.max(f[i+1][j+1],f[i][j]);
}
}
return f[n][m];
}
}
Go版本:
func longestCommonSubsequence(text1 string, text2 string) int {
n:=len(text1)
m:=len(text2)
f:=make([][]int,n+1)
for i:=range f {
f[i]=make([]int,m+1)
}
for i:=0;i<n;i++ {
for j:=0;j<m;j++ {
if text1[i]==text2[j] {
f[i+1][j+1]=f[i][j]+1;
}
f[i+1][j+1]=max(f[i+1][j+1],f[i+1][j])
f[i+1][j+1]=max(f[i+1][j+1],f[i][j+1])
f[i+1][j+1]=max(f[i+1][j+1],f[i][j])
}
}
return f[n][m]
}