比赛链接:
官方题解:
题目大意:
现有一串由01组成的字符串,每次判断字符串首和尾是否一个为0一个为1,如果是则删除01,直到不能再删除为止,求操作结束时,字符串最短长度。
解题思路:
官方题解思路为双指针,我解题时的思路是双端队列。先将字符串全部存入双端队列中,并记录队列长度,同时设置两个变量来存储队头和队尾,如果他们的和为1,队列长度减2,删除队头和队尾巴,结束时记得将队列清空!
代码演示:
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define ull unsigned long long
#define PII pair<int,int>
#define ll long long
using namespace std;
const float PI = 3.14159265359;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
deque<int> q;
cin>>n;
int cnt=n;//记录队列长度
string s;
cin>>s;
for(int i=0;i<n;i++)
{
q.push_back(s[i]-'0');//减’0‘是为了将字符串转化为数字
}
for(;;)//这里不用担心死循环
{
if(q.size()==0) break;
int fr = q.front();//取队头
int en = q.back();//取队尾
if(fr+en==1)
{
cnt -= 2;
q.pop_back();//去除队尾
q.pop_front();//去除队头
}else break;
}
cout<<cnt<<endl;
q.clear();//一定要记得清空队列
}
return 0;
}