做题笔记10(计算一个串的最长真前后缀,最长重复子串)


一、计算一个串的最长的真前后缀

1.题目

在这里插入图片描述

2.解答

#include<iostream>
#include<string>
#include <algorithm>
 
using namespace std;
 
string back(string str)
{
    reverse(str.begin(), str.end());
    return str;
}
void matched_Prefix_Postfix(string str)
{
    int len = str.length();
    int n = 0;
    int t = len - 1;
    string temp = back(str);
    string fstr;
    string bstr;
    int w = 0;
    int big;
    for (int i = 1; i < t; i++)
    {
        fstr = str.substr(0, i);
        bstr = temp.substr(0, i);
        bstr = back(bstr);
        if (fstr == bstr)
        {
            w = 1;
            big = i;
        }
    }
    if (w == 0)
    {
        cout << "empty";
    }
    else
    {
        cout << str.substr(0, big);
    }
}
int main()
{
    int t;
    cin >> t;
    string str;
    while (t--)
    {
        cin >> str;
 
        matched_Prefix_Postfix(str);
        cout << endl;
    }
}

3.反思

1.reverse()

在这道题中,运用了在下的reverse()函数,使得字符串倒序。reverse函数的使用需要两个参数,分别为要进行操作的字符串的第一个字符与最后一个,即str.begin()与str.end();

2.substr()

还学习了substr()函数,能够截取字符串。当传入一个参数时,从该数开始截取至字符串尾端;传入两个参数时,如substr(i,len)便截取i后长度为len的子字符串。

3.字符串复制

在完成该题目时,进行过复制字符串的尝试,接触了strcpy(),但是该函数中,被复制的字符串不能需为常量,在该题目中无法完成。

二、最长重复子串

1.题目

在这里插入图片描述

2.解答

# include<iostream>
 
using namespace std;
 
int solution(string a)
{
    int len = a.length();
    int longgest = len / 2;
    string t1;
    string t2;
    int n = -1;
    for (int l = longgest; l > 0; l--)
    {
        for (int i = 0; i < l; i++)
        {
            t1 = a.substr(i, l);
            t2 = a.substr(l + i);
            if (t2.find(t1) != -1)
            {
                return  l;
            }
        }
    }
    return n;
}
 
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        string s;
        cin >> s;
        cout << solution(s);
        cout << endl;
    }
}

3.反思

1.comapre()

在该题目中,尝试了使用compare函数,当两个字符串相等时,返回0,当该字符串大于传入字符串时,返回1,反之放回-1。

2.find()

find函数类似于包含,在该字符串中寻找是否有与传入字符串相等的子串。

3.拓展

leetcode同名题目
该题在leetcode中为困难难度,也是大厂面试题。这道题目要求考虑其所有重复子串(S 的连续子串,出现两次或多次,可能会有重叠)。返回任何具有最长可能长度的重复子串。而我所做的题目限定了字串不重复,省去了很多工作量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值