题目:
经典问题了,dp[i][j] 表示 text1[0..=i] 和 text2[0..=j] 的最长公共子序列长度,状态转移方程为
- $ text1[i] == text2[j] $ 时:
- $ dp[i][j] = dp[i-1][j-1] + 1 $
- otherwise:
- $ dp[i][j] = max(dp[i-1][j], dp[i][j-1]) $
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #include <string> #include <vector>
using std::string; using std::vector;
class Solution { public: int longestCommonSubsequence(string text1, string text2) { int i, j, n1 = text1.size(), n2 = text2.size(); vector<vector<int> > dp(n1, vector<int>(n2, 0));
for (i = 0; i < n1; i++) { if (text1[i] == text2[0]) { while (i < n1) dp[i++][0] = 1; break; } }
for (j = 0; j < n2; j++) { if (text2[j] == text1[0]) { while (j < n2) dp[0][j++] = 1; break; } }
for (i = 1; i < n1; i++) { for (j = 1; j < n2; j++) { if (text1[i] == text2[j]) dp[i][j] = dp[i - 1][j - 1] + 1; else dp[i][j] = std::max(dp[i - 1][j], dp[i][j - 1]); } }
return dp[n1 - 1][n2 - 1]; } };
|