题目描述
X最近爱上了一种奇怪的游戏,就是找出一个字符串中的最小循环节。
对于最小循环节的定义:对于字符串A存在字串B,使得A是由N个完整的B组成的,那么B就是A的一个循环节,长度最小的那一个为最小循环节。
输入
多组输入。
每组输入一个字符串,长度不大于80,只包含26个小写字母。
输出
输出一个字符串,代表最小循环节。
示例输入
aaaa abab
示例输出
a ab
这个题还是很有意思的,像我这种如此喜欢指针的人自认为使用指针再简单不过了
不过开始没有考虑全循环节的种类和如果不是循环节的处理情况WA了3次。
如果我在考试的时候能做出来么?代码虽然短,但是如果能在短时间内考虑周全的话。
#include<stdio.h> #include<string.h> int main() { char a[100],b[100]; int alen = 0; int len = 0; int tf = 1; char *p1 = NULL,*p2 = NULL,*tmp = NULL; //freopen ("1.txt","r",stdin); while(gets (a) != NULL) { tf = 1; alen = strlen(a); p1 = a; p2 = b; *p2 = *p1; len = 1; p2++; while (*p1 != '\0') { p1++; while (*p1 != a[0] && *p1 != '\0') { len++; *p2 = *p1; p2++; p1++; } if (*p1 == a[0] && alen % len == 0) { tmp = p1; while (*tmp != '\0') { if(memcmp (tmp,b,len) != 0) { *p2 = *p1; len++; p2++; break; } tmp += len; } if (*tmp == '\0') { *p2 = '\0'; puts (b); tf = 0; break; } } else { *p2 = *p1; len++; p2++; } } if (tf) { puts (a); } } return 0; }