D. 【例题4】字符串环
题目
将源输入的字符串复制一份插到后面,模拟首尾相连的环。
然后查找连续公共子串即可。
代码
#include<iostream>
#include<cstring>
using namespace std;
string s,s1,s2;
int l1,l2;
void in()
{
cin>>s, s1=s+s;//模拟首尾相连的环
cin>>s, s2=s+s;//模拟首尾相连的环
l1=s1.size();
l2=s2.size();
if(l1>l2)//短的在前,长的在后
{
swap(s1,s2);
swap(l1,l2);
}
}
bool find(string s1,string s2)//查找s1是否为s2的子串
{
int l1=s1.size(),l2=s2.size(),t=0;
for(int j=0; j<l2-1; j++)
{
if(s2[j]==s1[t])
{
t++;
if(t==l1) return 1;
}
else
{
if(j>=l2/2-1) return 0;
t=0;
}
}
}
int main()
{
in();
for(int len=l1/2; len>=1; len--)//枚举公共子串长度
{
for(int i=0; i<l1/2; i++)//枚举子串起始位置
{
if(find(s1.substr(i,len),s2))//在s1中截取子串并判断是否为s2的公共子串
{
cout<<len;
return 0;//直接退出,因为子串长度从大到小枚举,找到就必为最优
}
}
}
cout<<0;
}