力扣 — — 最长公共子序列
最长公共子序列
- 题源:1143. 最长公共子序列 - 力扣(LeetCode)
题目:
分析:
一道经典的题目:最长公共子序列(LCS)
-
题目大意:求两个字符串的最长公共序列。
-
算法:动态规划。
-
思路:
-
d p dp dp 数组:设置一个数组 d p [ i ] [ j ] dp[i][j] dp[i][j],含义第一个字符串的前 i i i 个字符与第二个字符串的前 j j j 个字符的最大公共子序列。
-
初始化: d p [ i ] [ 0 ] = 0 dp[i][0] = 0 dp[i][0]=0 , d p [ 0 ] [ i ] = 0 dp[0][i] = 0 dp[0][i]=0 ,也就是说当第一个字符长度为 0 时,最大公共子序列为 0 ,第二个字符长度为 0 时,最大公共子序列也为 0 ;
-
递推公式:
-
如果第一个字符串的第 i i i 个字符等于第二个字符的第 j j j 个字符时,将两个字符串都回退一个字符,取各自前一个字符匹配的最长公共子序列然后加 1:
d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + 1 dp[i][j] = dp[i - 1][j - 1] + 1 dp[i][j]=dp[i−1][j−1]+1 -
否则就是不相等的情况,这里也就是第一个字符串回退一个字符后与第二个字符串匹配的最长公共子序列,第二个字符串回退一个字符串后与第一个字符串匹配的最长公共子序列,并从这两个子序列中取最大值作为当前两个字符串匹配的最大公共子序列。
d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] ) dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) dp[i][j]=max(dp[i−1][j],dp[i][j−1])
-
-
代码:
class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
vector<vector<int>> dp(text1.length() + 1, vector<int>(text2.length() + 1, 0));
for(int i = 1;i <= text1.length();i ++) {
for(int j = 1;j <= text2.length();j ++) {
if(text1[i - 1] == text2[j - 1]){
dp[i][j] = dp[i - 1][j - 1] + 1;
}else {
dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);
}
}
}
return dp[text1.length()][text2.length()];
}
};