一、题意
给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。
二、解法
解法:
动态规划
dp[i][j]代表从text1[1:i]和text2[1:j]最长公共子序列的长度(从起始下标1开始):
text1[i]==text2[j]:
dp[i][j]=dp[i-1][j-1]+1
text1[i]!=text2[j]:
dp[i][j]=max(dp[i-1][j],dp[i][j-1]) 为text2前一个字符匹配到text1的j位置的最长长度和 text2当前字符匹配到text1的j-1位置的最长长度中的最大值。
时间复杂度:
O
(
n
m
)
O(nm)
O(nm)
空间复杂度:
O
(
n
)
O(n)
O(n)
三、代码
解法:
int longestCommonSubsequence(string text1, string text2) {
int m = text2.size();
int n = text1.size();
vector<int> dp(m+1,0);
vector<int> preDp(m+1,0);
int maxLen = 0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(text1[i]==text2[j]){
dp[j+1]=preDp[j]+1;
}
else{
dp[j+1]=max(dp[j],preDp[j+1]);
}
}
preDp = dp;
/* for(int j=0;j<=m;j++){
// preDp[j]=dp[j];
printf("%d ",preDp[j]);
}
printf("\n");*/
}
return dp[m];
}
四、总结
经典的动态规划问题,主要在不相等那里的状态转移要弄清楚。
五、引用
[1] leetcode:1143. Longest Common Subsequence
[2] leetcode:1143. Longest Common Subsequence官方解法