SSL-ZYC 2575 给出字符串

本文介绍了一种通过纯模拟方式解决寻找字符串中最长重复子串问题的方法,使用O(n^4)的时间复杂度来实现,并提供了详细的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:
给出一个由小写字母组成的字符串。你的任务是找出其最长的出现至少两次的子串的长度。


思路:
纯模拟。
这道题我用的是O(n^4)的方法。前两个循环分别枚举两个子串的起始位置,第三个循环枚举这两个字串的长度,最后一个循环用来比较两个子串是否相同。加上一点优化,AC!


代码:

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;

char a[201],b[201],c[201];
int n,maxn;

int main()
{
    scanf("%s",&a); 
    n=strlen(a);
    for (int i=0;i<=n-2;i++)
    {
        for (int j=i+1;j<=n-1;j++)  //枚举子串开始位置
        {
            for (int k=1;k<=n-1;k++)  //字串长度
            {
                int ok=1;
                memset(b,0,sizeof(b));
                memset(c,0,sizeof(c));
                for (int q=1;q<=k;q++) b[q]=a[q+i-1];
                for (int q=1;q<=k;q++) 
                {
                    c[q]=a[q+j-1];
                    if (c[q]!=b[q])  //如果与另一个字串不相同
                    {
                        ok=0;
                        break;  //退出
                    }
                }
                if (ok==1&&k>maxn) maxn=k;
                else if (ok==0) break;
            }
        }
    }
    printf("%d\n",maxn);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值