#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
/************************************************
求最长公共子序列长度
*************************************************/
int LCS(string str1, string str2) {
int len1 = str1.length();
int len2 = str2.length();
if (len1 == 0 || len2 == 0) return 0;
vector<vector<int>> dp(len1, vector<int>(len2, 0));
dp[0][0] = str1[0] == str2[0] ? 1 : 0;
for (int i = 1; i < len1; i++) dp[i][0] = str1[i] == str2[0] ? 1 : 0;
for (int i = 1; i < len2; i++) dp[0][i] = str1[0] == str2[i] ? 1 : 0;
for (int i = 1; i < len1; i++) {
for (int j = 1; j < len2; j++) {
if (str1[i] == str2[j]) {
dp[i][j] = 1 + dp[i - 1][j - 1];
}
else {
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
return dp[len1 - 1][len2 - 1];
}
/************************************************
求最长公共子串
*************************************************/
/*string LCSS(string str1, string str2) {
int len1 = str1.length();
int len2 = str2.length();
if (len1 == 0 || len2 == 0) return "";
vector<vector<int>> dp(len1, vector<int>(len2, 0));
dp[0][0] = str1[0] == str2[0] ? 1 : 0;
for (int i = 1; i < len1; i++) dp[i][0] = str1[i] == str2[0] ? 1 : 0;
for (int i = 1; i < len2; i++) dp[0][i] = str1[0] == str2[i] ? 1 : 0;
for (int i = 1; i < len1; i++) {
for (int j = 1; j < len2; j++) {
if (str1[i] == str2[j]) {
dp[i][j] = 1 + dp[i - 1][j - 1];
}
}
}
int end = 0;
int max_len = 0;
for (int i = 0; i < len1; i++) {
for (int j = 0; j < len2; j++) {
if (max_len < dp[i][j]) {
max_len = dp[i][j];
end = i;
}
}
}
return str1.substr(end - max_len + 1, max_len);
}*/
//版本二:O(1)的空间复杂度
string LCSS(string str1, string str2) {
int len1 = str1.length();
int len2 = str2.length();
if (len1 == 0 || len2 == 0) return "";
int max_len = 0;
int end = 0;
int row = 0, col = len2 - 1, len;
while (row < len1) {
int i = row, j = col;
len = 0;
while (i < len1&&j < len2) {
if (str1[i] != str2[j]) len = 0;
else len++;
if (len > max_len) {
end = i;
max_len = len;
}
i++; j++;
}
if (col > 0) col--;
else row++;
}
return str1.substr(end - max_len + 1, max_len);
}
int main(void) {
int a[] = { 1, -1, 2, -1, 4, -5, 6, -7 };
cout << LCSS("1D23D4B56", "B1D23CA45B6A") << endl;
return 0;
}
最长公共子序列&最长公共子串
最新推荐文章于 2020-05-21 11:13:41 发布