Chinaunix首页 | 论坛 | 博客
  • 博客访问: 102970
  • 博文数量: 24
  • 博客积分: 105
  • 博客等级: 民兵
  • 技术积分: 244
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-09 20:05
文章分类

全部博文(24)

文章存档

2015年(1)

2014年(9)

2013年(10)

2012年(4)

我的朋友

分类: C/C++

2013-05-16 15:03:43

我个人对解决这个问题提出了一个思路,但是开销很大。如果还有更好的想法,欢迎提出来共同探讨
思路:(拆分问题)
1.从第一个字符开始,查看可能重复的所有子字符串。(要重复,这个子字符串的长度不应该超过字符串长度的一半,并且两个字符或以上的才能是字符串)
2.字符串中除了最后两个字符不可能出现重复外,其他都可能出现重复
3.需要检查字符串中是否存在子字符串的函数

代码如下:

点击(此处)折叠或打开

  1. #include <string.h>
  2. #include <stdio.h>

  3. char * my_strstr(const char * s, const char * ss)
  4. {
  5.     int i, len;

  6.     len = strlen(s) - strlen(ss);

  7.     for (i = 0; i < len; i ++)
  8.     {
  9.         if (!memcmp(&s[i], ss, strlen(ss)))
  10.             break;
  11.     }

  12.     if (i >= len)
  13.         return NULL;

  14.     return &s[i];
  15. }

  16. char * find_max_str(const char * s)
  17. {
  18.     int i = 0,j = 0, max = 0;
  19.     int len = strlen(s);
  20.     char * p,* maxp = NULL;
  21.     char * ret = (char *)malloc(len >> 1);


  22.     if (!ret)
  23.         return NULL;

  24.     for (i = 0; i < len - i - 2; i ++)
  25.     {
  26.         for (j = 2; j <= (strlen(&s[i]) >> 1); j ++)
  27.         {
  28.             memset(ret, 0, len >> 1);
  29.             memcpy(ret, &s[i], j);
  30.             p = my_strstr(&s[i + 1], ret);
  31.             if (p)
  32.             {
  33.                 if (j > max)
  34.                 {
  35.                     max = j;
  36.                     maxp = p;
  37.                 }
  38.             }

  39.         }
  40.     }
  41.     
  42.     memset(ret, 0, len >> 1);
  43.     
  44.     if (maxp == NULL)
  45.     {
  46.         free(ret);
  47.         ret = NULL;
  48.     }
  49.     else
  50.     {
  51.         memcpy(ret, maxp, max);
  52.     }

  53.     return ret;
  54. }

  55. int main(void)
  56. {
  57.     char str[] = "ababcabcertabcdticketabcde";
  58.     char * p;

  59.     printf("%s\n", str);

  60.     p = find_max_str(str);

  61.     if (p)
  62.     {
  63.         printf("%s\n", p);
  64.         free(p);
  65.     }

  66.     return 0;
  67. }


阅读(1508) | 评论(0) | 转发(0) |
1

上一篇:strtok的用法

下一篇:vim中的字符串替换

给主人留下些什么吧!~~