您的位置:首页 > 编程语言

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

2016-04-05 00:06 267 查看
在一些程序竞赛里面经常会考一些开动思维的小题目.比如周期串.什么是周期串呢.

举例说明 : 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