一周前我做了作业,我必须用 C 语言编写一个函数。该函数获取一个正整数数组,它必须返回数组中的下一个数字。数组看起来像这样:{1,2,3,1,2,3,4,1,2,3,1,2,3,4,1,2,3,-1}; -1 表示数组的结尾。
我知道函数必须返回的数字是 1,但是,如何编写模式查找算法?我在互联网上没有找到任何解决方案,因为关于模式搜索的所有其他问题都与字符串有关,必须找到的模式已经给出。
一周前我做了作业,我必须用 C 语言编写一个函数。该函数获取一个正整数数组,它必须返回数组中的下一个数字。数组看起来像这样:{1,2,3,1,2,3,4,1,2,3,1,2,3,4,1,2,3,-1}; -1 表示数组的结尾。
我知道函数必须返回的数字是 1,但是,如何编写模式查找算法?我在互联网上没有找到任何解决方案,因为关于模式搜索的所有其他问题都与字符串有关,必须找到的模式已经给出。
如果模式的长度为1
,那么您将拥有a[k+1] == a[k]
所有可能的k
。
更一般地说,您将拥有a[k+plen] == a[k]
正确的plen
(模式长度)和所有可能的k
.
所以确定plen
从1
... 开始,在你的情况下,你会得到7
because a[7]==a[0]
, a[8]==a[1]
, ... a[16]==a[9]
,所以只需 return a[17-7]
。
基于pmg的答案,一种简单的确定方法plen
是使用蛮力:
首先假设plen
等于,1
然后增加直到找到模式。plen
1
您可以通过检查从每个元素开始的序列是否与数组plen
的第一个元素匹配来找到模式。plen
因此,如果当前plen
是3
,那么您检查索引到(包括)处的元素是否与索引到3
(5
包括)处的元素匹配。如果它们匹配,则检查从 index 开始的下一个序列。等等。0
2
6
如果数组结尾标记-1
在您刚刚搜索的序列中,那么您有plen
. 如果序列不匹配,则从增加的序列重新开始,然后plen
重试。