问题描述
东东有一个字符串X,该串包含偶数个字符,一半是 S 字符,一半是 T 字符
东东可以对该字符串执行
次操作:如果存在 ST 是该串的子串,则删除掉最左边的 ST。
即 TSTTSS⇒TTSS、SSSTTT⇒SSTT⇒ST⇒空
Input
(2 ≦ |X| ≦ 200,000)
Output
输出最终串的长度
Sample input
TSTTSS
Sample output
4
解题思路
题意就是不断删除这个那个字符串中的ST,仔细想想我们会发现,这道题其实很简单,记最终结果为ans,其中S的个数为anss,T的个数为anst,每当我们发现一个S,那么直接anss++;但是如果当前字符是T,anst++,并且如果anss!=0的话,说明前面一定有S,并且一定靠着这个T(如果不靠着T是不可能的,因为每一对ST都会被削掉,当前T的前面要么全是T,要么就是TTTSS这种类型的),因此我们就让anss–,anst–。最终遍历完这个字符串直接输出anst+anss即可。
完整代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
using namespace std;
long long anss,anst;
string s;
int main()
{
cin>>s;
for (int i=0; i<s.size(); i++){
if(s[i]=='S') anss++;
else {
anst++;
if(anss) anss--,anst--;
}
}
cout<<anss+anst<<endl;
return 0;
}