1、最长公共子序列问题(LCS问题)
给定两个字符串A和B,长度分别为m和n,要求找出它们最长的公共子序列,并返回其长度。例如:
A = “HelloWorld”
B = “loop”
则A与B的最长公共子序列为"loo",返回长度为3。
动态规划解法:
定义子问题:
dp[i][j]为字符串A的第一个字符到第i个字符串和字符串B的的第一个字符到第j个字符的最长公共子序列,如A为“app”,B为“apple”,dp[2][3]表示“ap”和“app”的最长公共子串。注意到代码中dp的大小为(n+1)x(m+1),这多出来的一行和一列是第0行和第0列。
初始条件:
“”和任意字符串的都为0,所以dp[i][0]和dp[0][j]都为0。
状态方程:
代码如下:
int findLCS(string str1, string str2) {
int m = str1.size(), n = str2.size();
vector<vector<int> > dp(m + 1, vector<int>(n + 1));
for (int i = 0; i <= m; i++) {
dp[i][0]