✔ 最佳答案
題意不清:
abcdabff 算不算有重複性?
因此,我寫了 2 個副程式。
isRepeating 算 abcabcabc 這類全程重覆的。
(註:上面列位程式都只考慮 2 次,這種 3 次的也是重覆!)
hasRepeat 算〝有〞就好。
若把 abcaff 的 a 算〝有重複,有點可笑!
所以,要2個字母起,才算重覆。
#include <stdio.h>
#include <string.h>
int isRepeating(char *str)
{ int i, j, l;
l = strlen(str);
for (i=1; i<=l>>1; i++)
{ if (l%i) continue;
if (strncmp(str, &str[i], i)) continue;
for (j=i<<1; j<=l-i; j+=i)
if (strncmp(str, &str[j], i)) return 0;
return i;
}
return 0;
}
int hasRepeat(char *str)
{ int i, j, k, l;
l = strlen(str);
for (i=1; i<l; i++)
for (j=0; j<i; i++)
for (k=i; k>1; k--) // length of repatting
if (!strncmp(&str[j], &str[i], k))
return k;
return 0;
}
int main(void)
{ char s[256];
int i;
printf("Please enter a string: ");
gets(s);
i = isRepeating(s);
printf(i ? "YES\n" : "NO\n");
if (i) printf("This string is repeating %d times.\n", strlen(s)/i);
else printf("This string does not repeat.\n");
printf(hasRepeat(s) ? "YES\n" : "NO\n");
return 0;
}
2007-06-23 05:54:35 補充:
hasRepeat 在速度上並未最佳化。
它只是寫成較好理解的方式。
(它接近 O(n^3)!
哇!是Compiler 在要處理最佳化 時的複雜度!)