题目描述
有一种宝石串,由绿宝石和红宝石串成,仅当绿宝石和红宝石数目相同的时候,宝石串才最为稳定,不易断裂。安安想知道从给定的宝石串中,可以截取一段最长的稳定的宝石串,有多少颗宝石组成。请你帮助他。
绿宝石用‘G’表示,红宝石用‘R'表示。
输入格式
一行由G和R组成的字符串
输出格式
最长的稳定的宝石串有多少颗宝石组成
输入输出样例
输入 #1复制
GRGGRG
输出 #1复制
4
说明/提示
RGGR为答案。
宝石数<=1000000
思路:
将绿色记为+1,红色记为-1,然后进行前缀和的计算,则,一个满足题目要求的区间和为零,即 区间的两个端点的前缀和的差等于零(端点的值相等)
因此对每一个前缀和的值进行如下处理:
若其第一次出现,则将其记录下来,否则计算其与第一次出现该值的区间大小,并尝试更新最大区间
#include<iostream>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
int main() {
char str[1000002];
int sum=0,ans=0;
map<int,int> m;m[0]=0; //前缀和的初始为0
cin>>(str+1); //字符串从1开始写入
for(int i=1; i<=strlen(str+1); i++) {
if(str[i]=='G')sum+=1;
else sum-=1;
if(m.find(sum)==m.end())m[sum]=i; //若sum的值为首次出现,则记录该值
else ans=max(ans,i-m[sum]); //尝试更新最大区间
}cout<<ans<<endl;
return 0;
}