最长公共子序列
题目描述
对于两个字符串,请设计一个高效算法,求他们的最长公共子序列的长度,这里的最长公共子序列定义为有两个序列U1,U2,U3...Un和V1,V2,V3...Vn,其中Ui<Ui+1,Vi<Vi+1。且A[Ui] == B[Vi]。
给定两个字符串A和B,同时给定两个串的长度n和m,请返回最长公共子序列的长度。保证两串长度均小于等于300。
测试样例:
"1A2C3D4B56",10,"B1D23CA45B6A",12
返回:6
#include <bits/stdc++.h> using namespace std; int mp[305][305]; string s1, s2; int fun1(int n, int m){ if(n < 0 || m < 0) return 0; if(mp[n][m]) return mp[n][m]; if(s1[n] == s2[m]){ return mp[n][m] = fun1(n - 1, m - 1) + 1; } else { return mp[n][m] = max(fun1(n - 1, m), fun1(n, m - 1)); } } int fun2(int n, int m){ for(int i = 0; i <= n; i++){ for(int j = 0; j <= m; j++){ if(i == 0 || j == 0){ mp[i][j] = 0; } else if(s1[i - 1] == s2[j - 1]){ mp[i][j] = mp[i - 1][j - 1] + 1; } else{ mp[i][j] = max(mp[i - 1][j], mp[i][j - 1]); } } } return mp[n][m]; } int main(){ int n, m; cin >> s1 >> n; cin >> s2 >> m; cout << fun1(n - 1, m - 1) << endl; //递归求解 cout << fun2(n, m) << endl; //递推求解 return 0; } /* 1A2C3D4B56 10 B1D23CA45B6A 12
6 */