求最长的重复子串

这个是牛客的原题链接题目链接,因为在网上看到一位大神的代码写的很好,但是没有仔细讲解所以我写这篇博客讲解一下代码以后自己复习也方便:

我们假设给定的字符串中重复的片段长度为i,不重复的长度为s,字符串的总长度为len,那么三者满足关系2*i+s=len,而这个重复片段最长就是len/2,题目要求最长重复子串长度,我们可以从i=len/2开始倒着枚举,检查到底是满足哪个重复长度,第一个满足的肯定就是最长的而对应的s当然要从0开始。

下面我们先写一个函数来检查当前长度下是否是重复的:

bool judge(string &a,int s,int len)
    {
        for(int i=s;i<s+len;i++){
            if(a[i]!=a[i+len])return 0;
        }
        return 1;
    }

功能十分简单一看就会了,然后我们开始按照上面的想法进行枚举:

int solve(string a) {
        int len=a.size();
        for(int i=len/2;i;i--)
        {
            for(int s=0;s<=len-i*2;s++)
            {
                if(judge(a,s,i))
                    return 2*i;
            }
        }
        return 0;
    }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值