趣味编程 - 最小周期串长度

在一些程序竞赛里面经常会考一些开动思维的小题目.比如周期串.什么是周期串呢.

举例说明 : ABCDABCDABCDABCDABCD

即, 由同一个源字符串重复n次得到的目标字符串.而这个源字符串就成为目标字符串的周期.上面的例子中,周期是4.

下面来分析一下这个问题怎么去解答:

刚接触到这样的题目,我首先的想法是如果一个字符串是周期串,那么它的字串也是周期字符串...但是其实是不对的.比如上面这个例子就能很好的说明问题.

那么这个思路能不能再做一下容错来完成这个问题的解答呢.想来想去,貌似不行.只能另辟蹊径,换个思路.

首先应该仔细的去分析一下周期字符串的特点:

1. 字符串以周期做循环.即 : 如果确定了这个周期,那么后面的所有这个周期都应该和前面的匹配才是.

2. 字符串的长度一定可以对周期进行取余.这个应该很好理解.应为字符串的总长度一定是周期的整数倍.

3. 一个周期字符串,最大周期是它本身,最小周期是1.

有了这三个特征,相比可以分析一些思路出来了.

1. 遍历周期长度,从1到字符串长度

2. 遍历字符串.与前面的字符串进行比较.就是说,如果我第一步假定长度是4, 那么这一步直接从下标4开始,然后和下标0去比对,然后下标5和下标1比对...一直到字符串长度耗尽...


下面给出实现代码 : 

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

char *roll = "ABCDABCDABCDABCDABCD";

int main(int argc, char **argv)
{
    int i = 0;
    int j = 0;
    int len = strlen(roll);

    for (i = 1; i <= len; i++)
    {
        if (len % i)
        {
            continue;
        }

        int ok = 0;
        for (j = i; j < len; j++)
        {
            if (roll[j] != roll[j % i])
            {
                ok = 1;
            }
        }

        if (ok == 0)
        {
            printf("%d\n", i);
            break;
        }
    }

    return 0;
}
上面程序中的 len % i 是做一下容错,因为如果len不能整除i,那么就没有必要去遍历这个长度了.

问题完美解决,不知道有没有更好的解法,反正我还没有想出来...

你可能感兴趣的:(c)