查找出现M次的最长的字符串

1040阅读 0评论2013-06-27 joepayne
分类:C/C++


    该问题来源于《编程珠玑》,解决的思想是用后缀数组,代码如下所示。
  1. /* Copyright (C) 1999 Lucent Technologies */
  2. /* From 'Programming Pearls' by Jon Bentley */

  3. /* longdup.c -- Print longest string duplicated M times */

  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <stdio.h>

  7. int pstrcmp(char **p, char **q)
  8. {
  9.     return strcmp(*p, *q);
  10. }

  11. int comlen(char *p, char *q)
  12. {    int i = 0;
  13.     while (*p && (*p++ == *q++))
  14.         i++;
  15.     return i;
  16. }

  17. #define M 2            //超过次数
  18. #define MAXN 5000000
  19. char c[MAXN], *a[MAXN];

  20. int main()
  21. { int i, ch, n = 0, maxi, maxlen = -1;
  22.     while ((ch = getchar()) != EOF) {
  23.         a[n] = &c[n];
  24.         c[n++] = ch;
  25.     }
  26.     c[n] = 0;
  27.     qsort(a, n, sizeof(char *), pstrcmp);
  28.     for (i = 0; i < n-M; i++)
  29.     {
  30.         if (comlen(a[i], a[i+M]) > maxlen)
  31.         {
  32.             maxlen = comlen(a[i], a[i+M]);
  33.             maxi = i;
  34.         }
  35.     }
  36.     printf("%.*sn", maxlen, a[maxi]);
  37.     return 0;
  38. }
    思路是这样的:数组a是一个指针数组,子数组a[i...i + M]表示M+1个字符串。由于数组是有序的,可以通过在第一个字符串i和最后一个字符串i+M上调用comlen函数快速确定这M+1个字符串共有的字符数目。
上一篇:字符串是否包含问题(一)
下一篇:有n个长为m+1的字符串,求前后m个字符匹配所能形成的最长字符串链。