C语言 如何知道数组中有多少个模式段?



所以基本上我的问题是: 我收到一个整数数组和一个带有要查找的整数模式的数组。 我需要返回第一个数组中有多少个模式段。

例如:

v=[5,  2,  2,  3,  4,  4,  4,  4,  1,  1, 2, 2] 
p=[2, 2]

这需要返回类似"V 中有 2 段 P "的内容。

我已经尝试过这个,但我认为这不是正确的方法:

int main()
{
int v[] ={5,  2,  2,  3,  4,  4,  4,  4,  1,  1, 2, 2};
int p[] ={2,2};
int sizev, sizep;
printf("%d", count_segments_repeated_ints(v,sizev,p,sizep));
return 0;
}

int count_segments_repeated_ints(int v[], int sizev, int p[], int sizep){
int i,j, ocr=0;
//sizeof
for(i=0; i < sizev; i++){
for(j=0; j < sizep; j++){
if(v[i]==p[j] && v[i+1]==p[j+1]){
ocr++;
}
}
return ocr;
}
}

一个稍微不同的解决方案是只使用单个循环并检查相等性并在数字匹配时递增j索引器。如果j-indexer 变得大于或等于sizep则存在匹配项,因此递增ocr。否则再次从 0 开始。

int i, j = 0, ocr = 0;
if (sizep > sizev) return 0;
for (i = 0; i < sizev; i++)
{
if (v[i] == p[j]) j++;
else
{
if (j > 0) i--;
j = 0;
}
if (j >= sizep)
{
ocr++;
j = 0;
// If overlapping segments are allowed uncomment the following line:
// i -= sizep - 1;
}
}
return ocr;

首先,您需要在sizev - sizep之前停止外部循环,这样您就不会访问v数组之外。

其次,您的内部循环正在为每个匹配字符递增ocr。仅当所有字符都匹配时,它才应递增它。而且您只需要将v[i+j]p[j]进行比较.

第三,return ocr;不应该在循环内。

int count_segments_repeated_ints(int v[], int sizev, int p[], int sizep){
int i,j, ocr=0;
for(i=0; i < sizev-sizep; i++){
for(j=0; j < sizep; j++){
int all_match = 1;
if(v[i+j] != p[j]){
all_match = 0;
break;
}
}
ocr += all_match;
}
return ocr;
}

对于程序变量中的初学者,sizevsizep未初始化。

通常,函数内的sizep可以大于sizev,甚至可以等于0

此循环由于包含的 if 语句

for(j=0; j < sizep; j++){
if(v[i]==p[j] && v[i+1]==p[j+1]){
ocr++;
}

调用未定义的行为,因为此表达式中的索引值可以指向数组之外p[j+1]。此外,具有模式的数组可以包含更多元素,而不仅仅是两个元素。

可以按演示程序中显示的方式定义函数。我重命名了该函数,因为此名称count_segments_repeated_ints与赋值不对应。

#include <stdio.h>
size_t count_sub_arrays( const int a1[], size_t n1, const int a2[], size_t n2 )
{
size_t count = 0;
if ( !( n1 < n2 ) && n2 != 0 )
{
for ( size_t i = 0, n = n1 - n2; i <= n; )
{
while ( i <= n && a1[i] != a2[0] ) ++i;
if ( !( n < i ) )
{
size_t j = 1;
while ( j < n2 && a1[i + j] == a2[j] ) j++;
if ( j == n2 )
{
++count;
i += n2;
}
else
{
++i;
}
}
}
}
return count;
}
int main(void) 
{
int a1[] = { 5,  2,  2,  3,  4,  4,  4,  4,  1,  1, 2, 2 };
int a2[] = { 2, 2 }; 
const size_t N1 = sizeof( a1 ) / sizeof( *a1 );
const size_t N2 = sizeof( a2 ) / sizeof( *a2 );

printf( "%zun", count_sub_arrays( a1, N1, a2, N2 ) );
return 0;
}

程序输出为

2

最新更新