openjudge 1.7.30 字符环

OpenJudge - 30:字符环


解题思路:

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
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<

你可能感兴趣的:(信息学奥赛-字符数组,c++,算法,蓝桥杯)