题目思路:题目大意是b和B按键功能不一样,b是删除之前距离b最近的一个小写字母,B是删除距离B最近的一个大写字母,如果找不到就忽略,b,B都不算入字符中,最后输出答案字符。
思路,先遍历一遍字符串,然后存好要输出的下标,利用vector模拟,如果出现了b和B,并且也可以删除,那就进行pop_back操作,读入就push_back。然后根据这俩数组判断条件输出。
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int t;
string s;
int main()
{
cin>>t;
while(t--)
{
cin>>s;
vector<int>q1,q2;
//分别存储所有在答案字符串里的小写字母的下标还有大写字母下标
for(int i=0;s[i];i++)
{
if(s[i]>='a'&&s[i]<='z')//如果是小写字母
{
if(s[i]=='b')//如果要进行删除操作
{
if(q1.size())//删除后合法
q1.pop_back();
}
else//放入
{
q1.push_back(i);
}
}
else//大写同理
{
if(s[i]=='B')
{
if(q2.size())
q2.pop_back();
}
else
{
q2.push_back(i);
}
}
}
int k1=0,k2=0;
//俩指针分别遍历两个vector
while(k1<q1.size()||k2<q2.size())//如果俩vector都没遍历完
{
if(k1<q1.size()&&(k2>=q2.size()||q1[k1]<q2[k2]))//要输出小写字母的情况
//首先可以合法输出,其次另一个不能输出了,或者第一个小于第二个的下标
{
cout<<s[q1[k1]];//输出
k1++;//指针后移
}
else
{
cout<<s[q2[k2]];
k2++;
}
}
puts("");
}
return 0;
}