【题目描述】
小 Y 最近在学习魔法。一个字符串是一个魔法句子的条件是,当且仅当其中 ℎ 和 a的个数相同。小 Y 找到了一本魔法书,希望你能找到其中最长的魔法句子。
输入格式
第一行有一个整数 t ,代表测试数据的数量。 接下来 t行,每行包含一个仅由 ℎ 和 a 组成的字符串。
输出格式
对于每组测试数据,输出一个非负整数,代表最长的魔法句子的长度
#include <bits/stdc++.h>
using namespace std;
int len,t,c;
string n;
int main(){
ios::sync_with_stdio(0),cin.tie(0);
cin>>t;
for(int i=1;i<=t;i++){
cin>>n;
len=n.size();
c=len;
int l[2*len]={};
int r[2*len]={};
for(int i=0;i<len;i++){
if(n[i]=='a'){
c++;
}else{
c--;
}
if(l[c]==0&&c!=len){
l[c]=i+1;
}else{
r[c]=i+1;
}
}
int ans=0;
for(int i=0;i<=len*2;i++){
ans=max(ans,r[i]-l[i]);
}
cout<<ans<<"\n";
}
return 0;
}
思路如下
可以引用相对差的概念用x[i]表示到第i个位置处,'a'的个数-'h'的个数的值,那么若x[a]==x[b],则(a,b]区间中'a'的个数等于'h'的个数
于是可以选择记录相对差为num的最左、最右下标位置l[num]和r[num],取r[num]−l[num]的最大值即可,复杂度O(n)