在一些程序竞赛里面经常会考一些开动思维的小题目.比如周期串.什么是周期串呢.
举例说明 : 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,那么就没有必要去遍历这个长度了.
问题完美解决,不知道有没有更好的解法,反正我还没有想出来...