文章目录
一、计算一个串的最长的真前后缀
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 的连续子串,出现两次或多次,可能会有重叠)。返回任何具有最长可能长度的重复子串。而我所做的题目限定了字串不重复,省去了很多工作量。