Algorithm 如何找到子序列?

Algorithm 如何找到子序列?,algorithm,computer-science,Algorithm,Computer Science,我得到了一个随机长度的随机数序列,由0,1,2组成: 201102220221 我还得到了一个数字:1或2我只能在序列中循环一次,我需要识别给定数字的所有子序列,通过另一个函数运行该值,并将该值添加到一个和(初始化为0) 任何0都可以替换为1或2。因此,子序列可以通过将其旁边的0替换为数字来“扩展”。如果子序列不能扩展到超过4的最小长度,我需要放弃它 例如,假设我得到了以下序列: 11011002102 还有数字1。我在开头标识长度2的子序列(参见第一个元素)。通过将第一个0、第三个和第四个

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

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

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

例如,假设我得到了以下序列:

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

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

sum += function(2);
sum += function (2);
我最终确定了1的最后一个子序列(参见第六个元素)。它当前的长度为1,可以扩展到最大大小为2,方法是将它旁边的零替换为小于4的1,因此我放弃它

有人能帮我写一个函数,它只在序列中循环一次请不要给我真正的代码,只给我想法、建议或伪代码


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

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

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

在循环的每次迭代中,考虑输入序列的当前字符以及它如何影响所存储的数据。 我试图在这里澄清这个问题,而不只是给你答案。请随时提出更多问题

编辑:

考虑一下你将如何一步一步地解决这个问题。以下是for循环的迭代:

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

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

--0--------
对,因为这不是一个
1
,所以现在知道这个子序列的长度是2-它不再增加了,但是因为这是一个
0
,如果它可以扩展到至少4,它可能仍然合格。扩展的子序列长度现在是
3

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

----1------
子序列长度
=
2
,以及
扩展子序列长度
=
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
----0----

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

也许您不应该使用单词序列来表示随机生成的数字和连续的相同数字。有点困惑。@Laksa“子序列”怎么样?经典问题。从你所知道的开始,通过跟踪你以前得到的来扩展。提示:你只关心你要找的号码和任何零汉克!在序列中添加for循环之后,我仍然不知道如何处理这个问题。你能为解决这个问题再加上一些提示吗?我实际上没有算法方面的经验,我两周前才开始编程。太棒了,明白了:)非常感谢!是的,我跟踪了当前序列和最后两个序列。当我到达第四个序列或“2”时,我计算了三个序列,并重置了所有内容。它工作得很好:)