C. 串应用- 计算一个串的最长的真前后缀

题目描述

给定一个串,如ABCDAB,则ABCDAB的真前缀有:{ A, AB,ABC, ABCD, ABCDA }ABCDAB的真后缀有:{ B, AB,DAB, CDAB, BCDAB } 因此,该串的真前缀和真后缀中最长的相等串为AB,我们称之为该串的“最长的真前后缀”。试实现一个函数string matched_Prefix_Postfix(string str),得到输入串str的最长的真前后缀。若不存在最长的真前后缀则输出empty

输入

第1行:串的个数 n第2行到第n+1行:n个字符串

输出

n个最长的真前后缀,若不存在最长的真前后缀则输出empty。

输入样例1 输出样例1
6
a
ab
abc
abcd
abcda
abcdab
empty\n
empty\n
empty\n
empty\n
a\n
ab
#include<iostream>
#include<string>

using namespace std;
string matched_prefix_postfix(string p){

    int k=-1 , j = 0 ;
    int m = p.length()+1;//题眼;避免忽略最后一位
    int *next = new int [m];
    next[0] = -1;
    while(j<m-1){
        if(k==-1||p[j]==p[k]){
            k++,j++;
            next[j] = k;
        }
        else k = next[k];
    }
    if(next[m-1]>0){
        string final(p,0,next[m-1]);
        return final;
    }
    else return "empty";

}
int main(){

    int t;
    cin>>t;
    string p;
    while(t--){

        cin>>p;
//        cout<<p.length()<<endl;
//        cout<<p.length()<<endl;
        string str_out=matched_prefix_postfix(p);
        cout<<str_out<<endl;
    }

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值