读书人

怎么用C语言求周期字符串最小周期

发布时间: 2012-09-25 09:55:59 作者: rapoo

如何用C语言求周期字符串最小周期?
若一字符串可由某个长度为K的字符串重复多次得到,就说该字符串是以K为周期的。
例:abcabcabc是以3为周期的。
输入一长度不超过80的串,输出它的最小周期。
刚学C,碰到字符串的问题就有点头痛,哪位能告诉我该怎么弄啊

[解决办法]

C/C++ code
#include <stdio.h>#include <string.h>int main(){    char strAll[] = "abcdabcdabcd";    int strAllLen = strlen(strAll);    int i; //字符串约数    for(i = 1; i < strAllLen/2; ++i)    {        if(0 == strAllLen % i)        {            //符合条件的周期,一定是原字符串长度的约数            int j;            for(j = 0; j < strAllLen; j += i)            {                if(0 != strncmp(strAll, strAll + j, i))                    break;            }            if(j >= strAllLen)            {                printf("%d\r\n", i);                break;            }        }    }    return 0;}
[解决办法]
如果不考虑效率,这个还是不怎么难的。

下面的说法,随便想的,仅供楼主参考。

先把整个字符串的长度用strlen得到,比如40,然后给40分解因素,那么就知道只有2,4,5,8,10,20这几种可能性,并让他们从小到大排列,也就是说最小周期是这几个数字之一。

然后就用上面的所有因素,针对整个字符串进行验证,比如
char* str = "abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde";
你就判断
do
{
if(*str == *(str+2)) // 2是从因素中的一个
{
str = str + 2;
...
}
else
...
...
}
这样就可以判断2是不是符合要求,如果不符合就判断下一个因素4...直到得出第一个符合条件的。
[解决办法]
好,下班,给你们写个函数吧,思路就是跟2楼的差不多,没那时间去想其他更好的算法:
C/C++ code
int getMinDivisor(const char *str){    int divisor = 1, j = 0;    int len = strlen(str);    for(divisor = 1; divisor<=len/2; divisor++){        if(len % divisor != 0)            continue;        for(j=0; j<len; j+=divisor){            if(strncmp(str, str + j, divisor))                break;        }        if(j == len)            break;    }    divisor = divisor==(len/2+1) ? len : divisor;    return divisor;} 

读书人网 >C语言

热点推荐