题目
1003-我要通过
解题思路
这道题主要是读懂题意,根据第一第二两个条件可得字符串如果中间为“PAT”,则字符串关于“PAT”对称,再由第三个条件可得初始情况为中间字符串为“PAT”,a=c为空字符串,或者是仅由字母 A 组成的字符串,即aPATa,推导一次得aPAATaa,中间每多一个字符‘A‘后面多一个字符串a。推导可得字符‘P’前的字符‘A’个数与字符‘P’和‘T’间的字符‘A’个数相乘等于字符‘T’后的字符‘A’个数。即 正确情况=A(x)PA(y)TA(z) x,y,z表示字母A的个数,x*y=z,其中y>=1。
代码
这里使用两种方法实现,一种直接通过循环查询字符串,一种通过字符串的find方法实现。
循环
#include<iostream>
#include<cstring>
#include<string.h>
using namespace std;
int main()
{
int n,p,t,flag;
string a;
cin>>n;
while(n--)
{
cin>>a;
flag=
1;
p=-
1;
t=-
1;
for(
int i=
0;i<a.length();i++)
{
if(a[i]==
'P')
{
if(p==-
1)
{
p=i;
}
else
{
flag=
0;
break;
}
}
else if(a[i]==
'T')
{
if(t==-
1)
{
t=i;
}
else
{
flag=
0;
break;
}
}
else if(a[i]!=
'A')
{
flag=
0;
break;
}
}
if((t-p)<
2||p*(t-p-
1)!=a.length()-t-
1)
{
flag=
0;
}
if(flag)
{
cout<<
"YES\n";
}
else
{
cout<<
"NO\n";
}
}
}
字符串find
#include<iostream>
#include<cstring>
#include<string.h>
using namespace std;
int main()
{
int n,p,t;
string a;
cin>>n;
while(n--)
{
cin>>a;
p=a.find_first_not_of(
'A');
if(p==
string::npos||a[p]!=
'P')
{
cout<<
"NO\n";
}
else
{
t=a.find_first_not_of(
'A',p+
1);
if(t==
string::npos||a[t]!=
'T'||t-p<
2||p*(t-p-
1)!=a.length()-t-
1)
{
cout<<
"NO\n";
}
else
{
cout<<
"YES\n";
}
}
}
}