题目链接:​​Longest Common Subsequence​

题目大意:给定两个字符串,要求你要找最长公共子序列(不要求连续,只需要保证先后顺序)

题目思路:一道DP好题吧,这个题不同于连续的写法,也不同于前缀,对于该题,可以想到一个dp解法,dp[i][j]表示text1的前i个和text2的前j个字符中的最长公共子序列,那么如果要往下一层递推会是什么情况呢,这时候需要比较当前的text1和text2位置上的字符是否相等,如果相等,那么dp[i][j] = dp[i-1][j-1]+1,否则,dp[i][j] = max(dp[i-1][j],dp[i][j-1]),为什么考虑的在相同字符的时候是dp[i-1][j-1]呢,因为字符相同的时候我们考虑的是i和j都没有被算上,所以递推的时候一定是i-1和j-1,而不是其他的位置

时间复杂度&&空间复杂度:O(nm)&&O(nm)

class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
int len1 = text1.size(),len2 = text2.size();
vector<vector<int>>dp(len1,vector<int>(len2));
dp[0][0] = text1[0] == text2[0]?1:0;
for(int i = 1;i < len1;i++) {
if(text1[i] == text2[0]) dp[i][0] = 1;
else dp[i][0] = dp[i-1][0];
}
for(int j = 1;j < len2;j++) {
if(text1[0] == text2[j]) dp[0][j] = 1;
else dp[0][j] = dp[0][j-1];
}
for(int i = 1;i < len1;i++){
for(int j = 1;j < len2;j++){
if(text1[i] == text2[j]) dp[i][j] = dp[i-1][j-1]+1;
else dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
//cout<<"i = "<<i<<" j = "<<j<<" dp[i][j] = "<<dp[i][j]<<endl;
}
}
return dp[len1-1][len2-1];
}
};