【每日一练】最长重复子串

学习目标:

  • 掌握字符串匹配

题目描述:

求串的最长重复子串长度(子串不重叠)。例如:abcaefabcabc的最长重复子串是串abca,长度为4。


输入:

测试次数t

t个测试串

输入样例

3
abcaefabcabc
szu0123szu
szuabcefg


输出:

输出样例

4
3
-1

参考答案

仅供参考

#include
using namespace std;
int main()
{
	int t;
	string s;
	cin>>t;
	while(t--){
		bool flag=false;
		cin>>s;
		int l=s.length();
		for(int i=l/2;i>=1;i--)
		{
			for(int j=0;j<l-i;j++)
			{
				string s1=s.substr(j,i);
				
				if( s.rfind(s1)>j+i-1 )
				{
					cout<<i<<endl;
					flag=true;
					break;
				}
			}
			if( flag )	break;
		}
		if( !flag )	cout<<-1<<endl;
	}
	return 0;
}

程序使用两个嵌套的循环来查找s中的重复子串。外层循环从字符串的中间位置开始,逐渐减小子串长度i。内层循环从字符串的开头开始,依次遍历可能的起始位置j。在每次循环中,程序使用substr函数截取长度为i的子串s1,并通过rfind函数查找s1在剩余部分字符串中的最后出现位置。

如果找到了满足条件的子串,即s1在剩余部分字符串中的最后出现位置大于起始位置加上子串长度减1,那么程序输出子串长度i,并将标志位flag设置为true,跳出内层循环和外层循环。如果没有找到满足条件的子串,则输出-1。


如果对你有用,点个赞吧!

你可能感兴趣的:(1024程序员节)