在字符串中查找最长重复子串的探讨

写一个函数,找出一个字符串中最长的重复子串。“t1t1”结果就是t1."cabcabca"结果就是cab或者abc或者bca。

#include <stdio.h>

#define BUF_MAX 1000

int index; //子串起始位置
int len;//子串长度

void str_search(const char *str)
{
 int i=0;
 while(str[i]!='/0') ++i;

 int strlen=i;

 for(i=strlen/2;i>0;--i)
 {
  int zeronum=0;
  for(int j=i;j<strlen;++j)
  {
   if (str[j]==str[j-i])
   {
    ++zeronum;
    if (zeronum==i)
    {
     index=j-2*i+1;
     len=i;
     return;
    }
   }
   else
   {
    zeronum=0;
   }
  }
 }
}


int main()
{
 char str[BUF_MAX];

 scanf("%s",str);

 str_search(str);

 printf("%d:%d/n",index,len);

 

说明:

假设str中有长度为m的连续子串,
则字符串移动m个位置后,与原串
 s0 s1 s2 s3 ... sm-1 sm sm+1 sm+2 ..... sn
                            s0   s1  s2 .............sn

一定有连续m个位置的字符是相等的;

如果有多个解,只返回第一个;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值