解题思路:
1.由题意得,两个字符串分别形成环状,判断公共子串的最大长度,形成环状的技巧可以加上本身字符串,这样就包含了所有形成环状的所有情况
2.创建一个记录累加长度的变量len和最大值max存放最长的公共长度,max=0;
3.接下来开始寻找公共部分,从字符串a开始逐个和字符串b每个字符去比较,如果a字符串当前位置的字符和b字符串当前位置的字符相等,len=1,表示已经有一个相同的字符了,创建一个while循环,num为计数器开始增加,如果a[i+num]==b[i+num],则len++,并且num++,继续判断下一个,直到不相等的时候,退出循环
4.退出while循环后,判断len是否大于max,如果是max=len,存储最大值,然后break,跳出字符串b的遍历,重新开始a的下一个字符继续查找
5.最后输出,坑点:为了形成环状,我们已经改变了两个字符串的长度,但是如果这两个字符串字符都相等的时候,比如a="aaa",b="aa";其实公共子串长度为2,但是因为我们让字符串加了本身,所以结果是4,显然不对,所以要对max进行判断,如果max小于原本字符串ab的最小值,则输出max,如果max>最小值,则应该输出最小值
#include<bits/stdc++.h>
using namespace std;
int main()
{
string a,b;
cin>>a>>b;
int lena=a.length();
int lenb=b.length();
a=a+a;//字符串加本身,形成环状后的所有情况
b=b+b;
int len,max=0;//len为累加相同字符的长度,max记录最大长度
for(int i=0;i<=a.length()-1;i++)//遍历a字符串的每一个字符
{
for(int j=0;j<=b.length()-1;j++)//遍历b字符串的每一个字符
{
if(a[i]==b[j])//如果字符串a当前位置和b的当前位置相等
{
len=1;//长度设为1,代表已经有一个字符相等
int num=0;//计数器
while(1)
{
num++;//计数器增加
if(a[num+i]==b[num+j])//判断i和j后面的字符是否相等
{
len++;//如果相等,则长度增加
}
else//否则退出循环
break;
}
if(len>max)//判断长度如果大于最大值
max=len;//max更新
break;//退出字符串b的遍历
}
}
}
int mine=min(lena,lenb);//取原字符串ab长度的最小值
if(max<=mine)//判断,如果max小于等于最小值,说明公共串是他俩的一部分
cout<<max;//输出max
else//如果max超过了较短字符串的长度
cout<<mine;//输出较小值,因为为了让他形成环状,字符串多加了一个本身
return 0;
}