字符串的问题 KMP

该博客讨论了一种字符串匹配算法,通过next数组计算子串的重复次数。当找到重复子串时,返回该子串;若无重复,检查next的下一个值,找到可行解。算法适用于文本处理和字符串搜索场景。

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

添加链接描述
思路
假设,next[n] = k ,意味着 s 0 , s 1 , s 2 , s 3 , s 4 . . . . . s k − 1 = = s n − k + 1 , s n − k + 2 . . . . . s n s_0,s_1,s_2,s_3,s_4.....s_{k-1} == s_{n-k+1},s_{n-k+2}.....s_n s0,s1,s2,s3,s4.....sk1==snk+1,snk+2.....sn,子串即为 s [ 0 : k ] s[0:k] s[0:k], 那么如何判断中间有没有子串呢?如果有子串,s[i:i+k]那么肯定s[0:i+k]的next就会是k,也就是说直接求next数组就可以了。求出next[n]看next[n]的值一共被取了几次。如果一次以上,那么我们就return s[0:next[n]],否则,我们就看next[next[n]],只要这不为-1那就是正确答案,为-1则不可能。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
string s;
int cnt[N], net[N], ans, len;
void get_next()
{
    int i = 0, j = -1;
    net[0] = -1;
    while(i < len)
    {
        if(j == -1 || s[i] == s[j])
            net[++i] = ++j;
        else
            j = net[j];
    }
}
int main()
{
    cin >> s;
    len = s.size();
    get_next();
    for(int i = 0; i < len; i++)
        cnt[net[i]]++;
    ans = net[len];
    if(ans == 0)
        cout << "Just a legend" << endl;
    else if(cnt[ans])
        cout << s.substr(0, ans);
    else if(net[ans])
        cout << s.substr(0, net[ans]);
    else
        cout << "Just a legend" << endl;
    //system("pause");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值