获取两个向量的最长交叉范围的第一个位置

时间:2017-11-10 16:51:28

标签: c++ algorithm search stl iterator

我正在研究一个考虑2个向量的问题,例如可以如下:

std::vector<int> v1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::vector<int> v2 = {      3, 4,       7, 8, 9, 10};

如果我执行std :: set_intersection,它会给我以下向量:

std::vector<int> v3 = {3,4,7,8,9,10};

在这种情况下,有2个子范围:3,4和7,8,9,10。最长的子范围是7,8,9,10,它的第一个元素是7.因此我想在v2 = 2中得到它的索引。

我正在考虑使用迭代器并将其重置为指向找到更长子范围时的第一个元素,然后稍后可以使用距离(v2.begin(),iter)来获取它,但无法计算它还没出来。有没有人知道如何一般地这样做?非常感谢。

1 个答案:

答案 0 :(得分:0)

您正在寻找的问题是Longest Common contiguous subsequence

使用动态编程的解决方案

  • 假设I = len(V1)&amp; J = len(V2)

  • 创建一个表len[I+1][J+1]以存储到目前为止的公共子序列,并在MaxCurrent

  • 中跟踪到目前为止的最长子序列
  • i&amp; V1的{​​{1}}元素的最长子序列到目前为止,j的{​​{1}}元素是:

    • 如果V2并更新V1[i-1] == V2[j-1] : (len[i-1][j-1] + 1)
    • 中的值
    • 其他0
  • 最大输出为MaxCurrent

注意:基数为max (MaxCurrent, len[i][j])