如何找到子序列?

时间:2013-11-22 03:49:00

标签: algorithm computer-science

我给出了随机长度的随机序列,由0,1,2组成:

201102220221

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

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

例如,假设我给出了序列:

11011002102

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

sum += function(2);

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

sum += function (2);

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

有人可以帮助我编写一个功能,通过仅循环执行序列来执行上述操作。 请不要给我真实的代码,只是想法,建议或伪代码

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

2 个答案:

答案 0 :(得分:1)

鉴于要求您只能遍历序列一次,您就知道代码的基本结构。

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

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

我试图在这里澄清问题,而不是只给你解决方案。随意提出更多问题。

编辑:

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

1----------

好的,我们正在寻找1,我们已经找到了一个。

-1---------

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

--0--------

是的,因为这不是1,这个子序列的长度现在已知为2 - 它不会再增加,但因为这是0,它可能会仍然有资格,如果它可以扩展到至少4.扩展的子序列长度现在是3

---1-------

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

----1------

subsequence length = 2expanded 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”会发生什么。

答案 1 :(得分:1)

暂时忘掉电脑;把它想象成使用铅笔和纸的更快版本。

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

例如:

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
...