我遇到了一些问题,我已经尝试了很多想法,但找不到最佳解决方案。
问题在于:
给定n个序列的序列,所有n个序列都按递增顺序排序但长度不同,找到每个序列共有的最大子序列。
例如,假设有3个序列A,B和C,
其中
A = {1 3 5 7 9 10 11 15 30 43 44 45 50}
B = {1 2 3 7 8 10 11 12 23 27 30 38 40 41 45 50 51 53 }
C = {0 1 3 7 9 11 12 13 14 19 20 24 28 30 50 51 61 90 99}
因此,所有这些的最大公共子序列是:
Answer = {1 3 7 11 30 50}
上面的例子说明了我想传达的想法。我怎样才能找到这样一个最大的共同子序列,它们都在递增中?
感谢您花时间和考虑阅读这篇文章。如果你能提供建议,我将非常感激。
答案 0 :(得分:5)
简单解决方案:您可以合并所有集合(线性复杂度),然后计算在最终集合中出现n次的数字(再次线性复杂度)。
使用std :: multiset(具有重复项)和merge in algorithm。
尝试here:
#include <iostream>
#include <set>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
// your code goes here
std::multiset<int> a {1,2,3};
std::multiset<int> b {1,2,3};
std::multiset<int> result;
merge( a.begin(), a.end(), b.begin(), b.end(),
std::inserter(result, result.begin()));
std::cout<<result.size()<<std::endl;
return 0;
}
结果:
成功时间:0记忆:16064信号:0
6
set-union语义扩展到multiset(如所讨论的here),但不是我总是在他们would中进行的方式。
应该采用两个多重集合的联合运算 区别于合并两套的操作。想象一下 参数集包含元素7的三个实例,第二个 set包含两个具有相同值的实例。工会将包含 只有三个这样的值,而合并将包含五个。
从标准,25.3.5:
通过定义union()以包含最大数量的set,将set操作的语义以标准方式推广到多个集合。 每个元素的出现,intersection()包含最小值, 等等。