0

我们在 C 中做了一些练习(我们必须只使用 stdio.h 库):

编写一个函数,接收两个字符串并返回第二个字符串在第一个字符串中出现的次数,根据循环参数可能存在重叠。

但是我没有成功对待 isCyclic 打开的情况。

例如,如果 isCyclic 不是 0 并且:

字符 *str1 = "aaa"; 字符 *str2 = "aa"; 我们必须返回 3

我在 isCyclic 中的错误是什么?..

这是我的实现:

int strLength(const char *str) {
    int count = 0;

    while (*str) {
        count++;
        str++;
    }

    return count;
}

unsigned int countPatInStr(const char *str1, const char *str2, int isCyclic)
{
    int patternSize = strLength(str2);
    int textSize = strLength(str1);
    int res = 0;
    int j;

    if (isCyclic) { // Here is the case when overlapping is needed
        if (patternSize > textSize) {
            for (int i = 0; i < patternSize - textSize; i++) {
                for (int j = 0; j < textSize; j++) {
                    if (str1[j] != str2[i + j]) {
                        break;
                    }

                    if (j == textSize && i + j < patternSize) {
                        str2 += i + j;
                    } else if (j == textSize && i + j == patternSize) {
                        res++;
                    }
                }
            }
            return 0;
        }
    } else {
        /* A loop to slide pat[] one by one */
        for (int i = 0; i <= textSize - patternSize; i++) {
            /* For current index i, check for pattern match */
            for (j = 0; j < patternSize; j++) {
                if (str1[i + j] != str2[j]) {
                    break;
                }
            }

            // if pat[0...M-1] = txt[i, i+1, ...i+M-1]
            if (j == patternSize) {
                res++;
            }
        }
        return res;
    }

    return 0;
}
4

1 回答 1

2

你的函数至少是无效的,因为在这个循环中

for (int i = 0; i < patternSize - textSize; i++) 

条件可以等于假。所以循环永远不会执行。

在这个循环中

            for (int j = 0; j < textSize; j++) {
                if (str1[j] != str2[i + j]) {
                    break;
                }

当非零时,使用j带有指针的索引和带有指针的str1索引。i + jstr2isCyclic

该函数可以编写得更简单,如下面的演示程序所示。

#include <stdio.h>

size_t strLength( const char *s )
{
    size_t n = 0;

    for ( ; *s; ++s ) ++n;

    return n;
}

size_t countPatInStr( const char *s1, const char *s2, _Bool isCyclic )
{
    size_t count = 0;

    size_t n1 = strLength( s1 );
    size_t n2 = strLength( s2 );


    if ( !( n1 < n2 ) || isCyclic )
    {
        size_t n = isCyclic ? n1 : n1 - n2 + 1;
        size_t divident = isCyclic ? n : n1;

        for ( size_t i = 0; i < n; i++ )
        {
            size_t j = 0;
            while ( j < n2 && s1[ ( i + j ) % divident] == s2[j] ) j++;

            count += j == n2;
        }
    }

    return count;
}

int main(void) 
{
    const char *s1 = "aaa";
    const char *s2 = "aa";

    printf( "%zu\n", countPatInStr( s1, s2, 0 ) );
    printf( "%zu\n", countPatInStr( s1, s2, 1 ) );

    return 0;
}

程序输出为

2
3

或者如果s1s2被定义为

const char *s1 = "aa";
const char *s2 = "aaa";

那么输出将是

0
2

或者如果它们被定义为

const char *s1 = "abcabc";
const char *s2 = "abc";

那么输出是

2
2

这是你需要的吗?

于 2019-11-14T16:31:52.023 回答