算法初试
题目:
给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列。
一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。
例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。
若这两个字符串没有公共子序列,则返回 0。
示例 1:
输入:text1 = “abcde”, text2 = “ace”
输出:3
解释:最长公共子序列是 “ace”,它的长度为 3。
示例 2:
输入:text1 = “abc”, text2 = “abc”
输出:3
解释:最长公共子序列是 “abc”,它的长度为 3。
示例 3:
输入:text1 = “abc”, text2 = “def”
输出:0
解释:两个字符串没有公共子序列,返回 0。
提示:
1 <= text1.length <= 1000
1 <= text2.length <= 1000
输入的字符串只含有小写英文字符。
class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
using IntIter = std::vector::iterator;
std::vector<std::pair<int, int>> datas;
int n1 = text1.size();
int n2 = text2.size();
for (int i = 0; i < n1; ++i) {
char c = text1[i];
int tt1 = text2.find_first_of(c);
if (tt1 != -1) {
bool has_data = false;
for (int j = 0; j < datas.size(); ++j) {
if (c == text2[datas[j].first]) {
has_data = true;
}
int tt2 = text2.find_first_of(c, datas[j].first);
if (tt2 != -1) {
datas[j].first = tt2;
datas[j].second++;
}
}
if (has_data == false) {
datas.push_back(std::make_pair(tt1, 1));
}
}
}
int max_count = std::numeric_limits<int>::min();
for (auto data : datas) {
if (data.second > max_count) {
max_count = data.second;
}
}
return max_count;
}
};
————————————————
版权声明:本文为CSDN博主「c_木ss」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/SMith7412/article/details/105482099