感觉自己的方法很麻烦但是也是自己思考的结果所以分享一下
题目大意就是交换一个S和G使得连续的G的个数最大
思路:
将S与G分别存在数组a,b中,把连续G的下一个连续S的坐标相同,然后遍历所有的G判断下一个S是一个还是多个,如果是一个S那么可以从前面或者后面拿一个S与之交换如果是多个就是说可以前后两个G互相交换然后在对特殊的位置特判
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
int a[111111]={0};
int b[111111]={0};
int main()
{
int n;
cin>>n;
char str[111111];
getchar();
cin>>str;
int cont1=0;
int cont2=0;
int i=0;
if(str[0]=='S')
{
for(;str[i]!='\0';i++)
{
if(str[i]=='G')
break;
}
}
for(;str[i]!='\0';i++)
{
if(str[i]=='G')
{
int num=0;
for(;str[i]!='\0';i++)
{
if(str[i]=='G')
num++;
else
break;
}
a[cont1++]=num;
i--;
}
else if(str[i]=='S')
{
int num=0;
for(;str[i]!='\0';i++)
{
if(str[i]=='S')
num++;
else
break;
}
b[cont2++]=num;
i--;
}
}
int max1=0;
if(b[0]==0)
{
max1=a[0];
}
else
{
for(int i=0;i<cont1;i++)
{
if(i==cont1-1)
{
if(i==0)
max1=max(max1,a[i]);
else
{
if(b[i-1]==1)
{
max1=max(max1,a[i]+a[i-1]);
}
else
max1=max(max1,max(a[i-1]+1,a[i+1]+1));
}
}
else
{
if(b[i]==1)
{
if(a[i+2]!=0)
max1=max(max1,a[i]+a[i+1]+1);
else
{
if(i>0)
max1=max(max1,a[i]+a[i+1]+1);
else
max1=max(max1,a[i]+a[i+1]);
}
}
else
max1=max(max1,max(a[i]+1,a[i+1]+1));
}
}
}
cout<<max1<<endl;
return 0;
}