目录
题目描述
求串的最长重复子串长度(子串不重叠)。例如:abcaefabcabc的最长重复子串是串abca,长度为4。
输入
测试次数t
t个测试串
输出
对每个测试串,输出最长重复子串长度,若没有重复子串,输出-1.
输入样例
3
abcaefabcabc
szu0123szu
szuabcefg
输出样例
4
3
-1
思路分析
用的穷举法,比较好想。最外层循环表示判断长度为i的子串。s1是长度为i的一个子串,s2是之后所有的长度为i的子串,若s1==s2,找到重复子串,更新max的值。
当时打这道题的时候卡了很久,一是想用next[]来解决,但一直没有得出结果。二是不会用substr这个函数。
s.substr(pos, len);
返回值: string,包含s中从pos开始的len个字符的拷贝(pos的默认值是0,len的默认值是s.size() - pos,即不加参数会默认拷贝整个s)
AC代码
#include<iostream>
#include<string>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
string str;
cin >> str;
int max=0;
for(int i=1;i<=str.length()/2;i++){
for(int j=0;2*i+j<str.length();j++){
string s1=str.substr(j,i);
for(int k=0;j+i+k+i<=str.length();k++){
string s2=str.substr(j+i+k,i);
if(s1==s2) max=i;
}
}
}
if(max>0)
cout << max << endl;
else
cout<<"-1"<<endl;
}
return 0;
}