【问题标题】:How to find subsequences?如何找到子序列?
【发布时间】:2013-11-22 03:49:00
【问题描述】:

我得到一个随机长度的数字序列,由 0、1、2 组成:

201102220221

我还得到了一个数字:1 或 2。我只能循环遍历序列一次,我需要识别给定数字的所有子序列,运行值通过另一个函数并将该值添加到总和(初始化为 0)。

任何 0 都可以替换为 1 或 2。因此可以通过将旁边的 0 替换为数字来“扩展”子序列。如果一个子序列不能扩展到最小长度超过4,我需要丢弃它。

例如,假设给定序列:

11011002102

和数字 1。我在开头标识长度为 2 的子序列(参见第一个元素)。通过将第一个 0、第三个和第四个零替换为 1,它可以扩展为长度为 7 的子序列。因此,我通过一个函数运行它的当前长度并将其添加到总和中。

sum += function(2);

然后我确定 1 的下一个子序列(参见第四个元素)。它目前的大小为 2,通过替换它周围的零,可以扩展到最大大小为 7。所以我将它的长度传递给一个函数并将其添加到总和中。

sum += function (2);

我终于确定了 1 的最后一个子序列(见第六个元素)。它目前的长度为 1,可以通过将其旁边的零替换为小于 4 的 1 来扩展为最大大小为 2,因此我将其丢弃。

有人可以帮我编写一个函数,通过只循环一次序列来完成上述操作。 请不要给我真正的代码,只是想法、建议或伪代码

我没有任何工作要分享,我完全迷失了。我也不知道算法,所以请不要开始谈论动态规划或线性规划之类的东西,而是解释解决问题的可能方法。

【问题讨论】:

  • 也许您不应该使用 sequence 这个词来表示随机生成的数字和连续的相同数字。有点混乱。
  • @Laksa “子序列”怎么样?
  • 经典dp 问题。从你所知道的开始,并通过跟踪你以前得到的东西来扩展。提示:您只关心您要查找的数字和任何零

标签: algorithm computer-science


【解决方案1】:

鉴于你只能循环一次序列,你知道代码的基本结构。

给定丢弃子序列(扩展长度为 4 或更多)和处理子序列(未扩展序列长度)的参数,您就知道在此过程中需要跟踪哪些数据。找出如何根据您的环境和语言约定最好地存储这些数据。

在循环的每次迭代中,考虑输入序列的当前字符以及它如何影响存储的数据。

我已尝试在此处澄清问题,而不仅仅是将解决方案交给您。欢迎提出更多问题。

编辑:

考虑如何逐步分解问题。以下是 for 循环的迭代:

1----------

好的,我们正在寻找1s,我们直接找到了。

-1---------

酷,又一个1,现在我们的子序列长度增加到了2

--0--------

对,因为这不是1,所以这个子序列的长度现在已知为 2 - 它不再增加,但因为这是0,它可能仍然符合条件可以扩展至至少 4 个。扩展后的子序列长度现在为 3

---1-------

扩展后的子序列长度现在是4!这意味着我们可以在通过function 后将最后一个序列长度添加到总和中。这也是另一个子序列的开始——因此子序列长度现在重​​置为1,但扩展的子序列长度在4 处仍然有效。这意味着这个子序列已经足够长,不会被拒绝,但是我们在这个阶段还没有完成它的长度。

----1------

subsequence length = 2,和expanded subsequence length = 5

-----0-----

这标志着第二个子序列的结束,像以前一样处理它。等等

------0----
-------2--- <- expanded subsequence length gets reset here
--------1-- <- start of another subsequence
---------0- <- expanded length is 2
----------2 <- expanded length is not long enough for this to qualify, discard it

所以,相当直截了当。我们需要跟踪两个因素:subsequence lengthexpanded subsequence length

一旦你得到这个工作,想想这个输入序列“1010101”会发生什么。

【讨论】:

  • 谢谢!在添加一个 for 循环来循环序列后,我仍然不知道如何解决这个问题。您能否为解决方案添加更多提示?我真的没有算法经验,我两周前才开始编程。
  • 太棒了,明白了 :) 非常感谢!
  • 是的,我跟踪了当前序列和最后两个序列。当我达到第四个序列或“2”时,我计算了三个序列,并重置了所有内容。它完美地工作:)
【解决方案2】:

暂时忘掉电脑吧;将其视为使用铅笔和纸的更快版本。

试着想象当你遍历序列的每个元素时你会如何解决这个问题;每次迭代时您可能想要在纸上写下和/或编辑的内容(您在序列中到达的每个元素)。

例如:

Sequence = 11011002102
Index 0:
    Value is 1
    Current is 1, Previous was null
    Tracking a subsequence of 1's starting at 0 => [1,0] = 1
Index 1:
    Value is 1
    Current is 1, Previous was 1
    Current == Previous so the subsequence length is increased by 1 => [1,0] = 2
...

【讨论】:

    猜你喜欢
    • 2014-05-22
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    相关资源
    最近更新 更多