题目大意:
/
t组数据,每组给你一个长为n的字符串,
字符串由T和M组成,问你是否存在TMT(不是严格的紧挨)
存在,如果由则输出YES 否者输出NO
/
先分析我的代码(改4.0之后的代码):
int t;
cin>>t;
while(t -- )
{
int n ;
cin>>n;
int sum =0;
getchar();
int pos = 0;
int sum2 = 0;
int sum1 = 0;
这里我先处理了一下最后一个M的位置,同时还记录了M的个数
这样子就可以判断M前面的T是否和M的数量一样了
for(int i=0; i<n; i++)
{
scanf("%c",&s[i]);
if(s[i]=='M')
{
pos = i;
sum2++;
}
}
这里又判断了最后一个M之后的所有T
(这里就开始出错了,因为如TTMTMT)
for(int i=pos; i<n; i++)
{
if(s[i]=='T')
{
sum1++;///我这里判断了 最后一个M前面的T
}
}
if(sum1!=sum2) 如果sum1!=sum2 这里其实就错了 最后一个M之后的T 和 之前的T相比
cout<<"NO"<<endl;
else
{
int ft = 0;
int fb = 0;
int st = 0;
bool flag = true;
for(int i=0; i<n; i++)
{
if(s[i]=='T')
ft++; 如果有T那么ft++
if(s[i]=='M')
{
st++;如果有M st++ 其实这里都乱套了
ft--;
sum-=2;
if(ft<0)
{
cout<<"NO"<<endl;
flag =false;
break;
}
}
if(i==n-1&&s[i]=='M'&&ft)
{
cout<<"NO"<<endl;
flag =false;
break;
}
}
if(flag)
{
if(st!=ft)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
}
}
我们来看正解
先考虑,其实每一个M前面的T的数量 只需要>sum(M) 就行
然后M后面如果有T 那么直接减就完了,这样子就保证了最近最优
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n ;
string s;
cin>>n;
cin>>s;
int t= 0,m=0,cnt = 0;
bool flag = true;
int len =s.size();
for(int i=0;i<len;i++)
{
if(s[i] =='T')
{
t++;
if(cnt)
cnt--;
这样子就保证了 M基本都是和他最近的一个T 消除的
同时也就保证了 T 是不会乱来 的
}
else
{
m++;
cnt++;
if(m>t)如果m大于了 m前面的T的个数
flag =false;
}
}
如果m还有剩余 或者 t还有剩余
if(t!=m*2||cnt) flag =false;
if(flag) cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}