題干:
代碼:
class Solution {
public:int longestCommonSubsequence(string text1, string text2) {vector<vector<int>>dp(text1.size() + 1, vector<int>(text2.size() + 1, 0));for(int i = 1; i <= text1.size(); i++){for(int j = 1; j <= text2.size(); j++){if(text1[i - 1] == text2[j - 1])dp[i][j] = dp[i - 1][j - 1] + 1;else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);}}return dp[text1.size()][text2.size()];}
};
遞推公式:如果相同,則后一個為前一個長度加一;如果不相同(如圖c不等于e),情況一:考慮c不考慮e,則變成abc與ac的最長公共子序列,此時為dp[i][j-1]; 情況二:考慮e不考慮c,則變成ace與ab的最長公共子序列,此時為dp[i-1][j]。綜上最后dp[i][j]取他們當中最大的一個。
定義:dp[i][[j]為以 i - 1和j - 1為結尾的最長公共子序列長度。