题目链接
题意
t组数据,每组包含长度为n的字符串。字符串由字符T和字符M 构成
问能否把它划分成若干个不相交的子序列使所有的子序列都为TMT
若存在则输出YES,不存在则输出NO
思路
1.观察样例思考存在时具备的条件
2.反向思考不存在时的条件
坑点
无
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int T,n;
string s;
int t,m,f=1;
int main()
{
cin>>T;//T组数据
while(T--)
{
cin>>n>>s;//每组对应的字符数量和字符串
// s=" "+s;
for(int i=1;i<=n;i++)//正序遍历
{
if(s[i]=='T')//字符等于T
{
t++;//t++
}
if(s[i]=='M')//字符等于M
{
m++;//m++
}
if(t<m)//只要T的数量小于M
{
f=0;//f变为0 进行标记
break;//不可能,则停止
}
}
t=0,m=0;//每次遍历后归零
for(int i=n;i>=1;i--)//逆序遍历
{
if(s[i]=='T')//同上
{
t++;
}
if(s[i]=='M')
{
m++;
}
if(t<m)
{
f=0;//不可能则归零并停止
break;
}
}
if(f==0||t!=m*2)//若f=0或t不是m的二倍
{
cout<<"NO"<<endl;//输出NO
}
else{
cout<<"YES"<<endl;//满足条件输出YES
}
t=0,m=0,f=1;//每输出一个结果进行归零
}
return 0;
}
总结
寻找规律,进行模拟