宝石串(前缀和判断最大区间)

题目描述

有一种宝石串,由绿宝石和红宝石串成,仅当绿宝石和红宝石数目相同的时候,宝石串才最为稳定,不易断裂。安安想知道从给定的宝石串中,可以截取一段最长的稳定的宝石串,有多少颗宝石组成。请你帮助他。

绿宝石用‘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;
}
发布了42 篇原创文章 · 获赞 16 · 访问量 3408

猜你喜欢

转载自blog.csdn.net/qq_41542638/article/details/97622042
今日推荐