5

我的代码当前返回最大子字符串的长度:

for(int i = 1; i<=l-1;i++)
{
   counter = 1;

   for(int j = 0; j<i;j++)
   {
      if(seq[j]<seq[j+1])
      {
         count[j] = counter++;    
      }
   }
}
     for(int i = 0;i<l-1;i++)
     {
        if(largest < count[i+1])
        {
           largest = count[i+1];
        }

     }

假设 seq 是序列中的数字。因此,如果序列是:5;3;4;8;6;7,它会打印出 4。但是,我希望它也打印出 3;4;6;7,这是升序中存在时间最长的。

我正在尝试获取最大子序列本身和实际序列的长度,但我已经有了长度。 我的直觉是将每个数字存储在数组中,同时计算计数。所以返回最长的计数,也可以返回附加到它的数组。我认为这可以通过哈希表来完成,但我不确定如何使用它们。

我只是在寻找提示,而不是答案。

谢谢

4

1 回答 1

2

您需要为最长的升序子序列实现动态规划算法。这个想法是为每个位置存储一对值i

  • 结束于位置的最长上升子序列的长度i
  • 在这种升序子序列中,当前项之前的项的索引,或者-1如果所有先前的数字都大于或等于当前项。

您可以轻松地构建这两个数组,方法是将第一对设置为{Length=1, Prior=-1},按升序遍历数组,并在 index 处寻找当前项目的“最佳”前任i。前任必须符合以下两个条件:

  • 它必须具有较低的索引并且小于位于 的项目i,并且
  • 它必须结束一个长度大于您目前找到的序列的升序子序列。

以下是数据如何查找您的序列:

Index:        0  1  2  3  4  5
Value:        5  3  4  8  6  7
------------  ----------------
Length:       1  1  2  3  3  4
Predecessor: -1 -1  1  2  2  4

完成运行后,在 s 数组中找到最大值length,然后使用前任的索引将其链接回开头,直到您点击-1.

于 2013-07-26T16:16:35.157 回答