后缀数组求最大重复子串

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
 #define MAXCHAR 5000 //最长处理5000个字符
 
 char c[MAXCHAR], *a[MAXCHAR];
 
 //
 int comlen( char *p, char *q )
 {
    int i = 0;
    while( *p && (*p++ == *q++) )
        ++i;
    return i;
 }
 
 int pstrcmp( const void *p1, const void *p2 )//返回值必须是int,两个参数的类型必须都是const void *
 {
    return strcmp( *(char* const *)p1, *(char* const*)p2 );
	  //strcmp(s1,s2) 判断两个字符串s1和s2是否相同,相同返回ture ,不同返回false
 }

int main()
{
     char ch;
     int  n=0;
     int  i, temp;
     int  maxlen=0, maxi=0;
     printf("Please input your string:\n");
     while( (ch=getchar())!='\n' )//在读取输入时,首先初始化a,这样,每个元素就都指向输入字符串中的相应字符
	 {
         a[n]=&c[n];//数组a命名为"后缀数组
         c[n++]=ch;//把ch的值赋值给a[n],然后n变成n+1
    }
    c[n]='\0';  //将数组c中的最后一个元素设为空字符,以终止所有字符串。
    qsort( a, n, sizeof(char*), pstrcmp );//对后缀数组进行快速排序,以将后缀相近的(变位词)子串集中在一起
	//qsort包含在<stdlib.h>头文件中,此函数根据你给的比较条件进行快速排序,通过指针移动实现排序。
	//排序之后的结果仍然放在原数组中。使用qsort函数必须自己写一个比较函数。第三个参数是单个元素的大小.第四个比较函数
    
	for(i=0; i<n-1; ++i )//使用comlen函数对数组进行扫描比较邻接元素,以找出最长重复的字符串:
	{
        temp=comlen(a[i], a[i+1]);
        if( temp>maxlen)
		{
            maxlen=temp;
            maxi=i;
        }
   }
   printf("%.*s\n",maxlen, a[maxi]);
   system("PAUSE");
   return 0;
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值