DS串应用—最长重复子串

Posted szu-ds-wys

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DS串应用—最长重复子串相关的知识,希望对你有一定的参考价值。

题目描述

求串的最长重复子串长度(子串不重叠)。例如:abcaefabcabc的最长重复子串是串abca,长度为4。

 

输入

测试次数t

 

t个测试串

 

输出

对每个测试串,输出最长重复子串长度,若没有重复子串,输出-1.

 

样例输入

3 abcaefabcabc szu0123szu szuabcefg

样例输出

4 3 -1

提示

#include<iostream>
#include<string>
using namespace std;
int *getnext(string p)
{
    int j=0,k=-1;
    int *next=new int[p.size()];
    next[0]=-1;
    while(j<(int)p.size()-1)
    {
        if(k==-1||p[j]==p[k])
        {
            j++;
            k++;
            next[j]=k;
        }
        else
            k=next[k];
    }
    return next;
}
 
int KMP(string s,string p)
{
    int i=0,j=0;
    int *next=getnext(p);
    while(i<(int)s.size()&&j<(int)p.size())
    {
        if(j==-1||s[i]==p[j])
        {
            i++;
            j++;
        }
        else
            j=next[j];
    }
    if(j==(int)p.size())
        return i-j+1;
    return -1;
}
int Find(string s)
{
    int L=s.size();
    int Max=-1;
    for(int i=0;i<L;i++)
    {
        for(int j=i;j<L;j++)
        {
            string p=s.substr(i,j-1);
            string save=s;
            int firstindex=KMP(s,p);
            int slength=s.size();
            int plength=p.size();
            string S=s.substr(0,firstindex-1);
            string after=s.substr(firstindex-1+plength,slength);
            S+=after;
            if(KMP(S,p)!=-1)
            {
                int t=plength;
                if(t>Max)
                    Max=t;
            }
            s=save;
        }
    }
    if(Max==0)
        return -1;
    return Max;
}
 
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        string s;
        cin>>s;
        cout<<Find(s)<<endl;
    }
    return 0;
}

以上是关于DS串应用—最长重复子串的主要内容,如果未能解决你的问题,请参考以下文章

符串的最长无重复字符的子串长度

leetcode T3 无重复字符的最长子串详解

算法--最长无重复字符子串

求字符串的最长无重复字符子串长度

子序列与子串问题

子序列与子串问题