如何用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;}