PAT.1003我通过了!

题目如下

分析:
要能得到答案正确字符串必须:
1,至少3个字符且全由P,A,T组成,所以少于三个字符或者有其他字符的可以直接false。
bool noelse(string str)
{
	int i,m=str.length();
	for(i=0;i<m;i++)
	{
		if(str[i]!='P'&&str[i]!='A'&&str[i]!='T')
			return false;
	}
	return true;
}
2,XPATX则,PAT的前后必须一样。P的前和T的后必须都是A组成的字符串或者空。

3,如果aPbTc正确,那么aPbATca正确。则b一定不可能是空,如果b是‘A'则c==a,那么aPbATca==aPAATaa是正确的。如果b是‘AA'则c==aa。那么aPbATca==aPAAATaaa是正确的。

所以我们可以得到PT之间有b个A,b>0,且可以得到aPbTc正确时,c=a*b;
前台数据有:
还有些后台数据是前台没有的例子如:“P”“A”“T”“AP”“PA”“APT”“PATT”“PAAA”“AAPA”等等





/*
这题要注意三种前台没有的数据类型
1.P,A,T,PA
2.PATT
3.PAAA,AAAP,APAA
*/
#include<iostream>
#include<string>
using namespace std;
bool isallA(string a,int b,int e)
{
	int i;
	for(i=b;i<e;i++)
	{
		if(a[i]!='A')
			return false;
	}
	return true;
}
bool noelse(string str)
{
	int i,m=str.length();
	for(i=0;i<m;i++)
	{
		if(str[i]!='P'&&str[i]!='A'&&str[i]!='T')
			return false;
	}
	return true;
}
int main()
{
	int n,m,i,j,k;
	string str;
	bool flag;
	while(cin>>n)
	{
		while(n!=0)
		{
			cin>>str;
			m=str.length();
			j=0;
			flag=true;
			//如果P,A,T等等低于3位的均直接false;
			if(noelse(str)==true&&m>=3)
			{
				for(i=0;i<m;i++)
				{
					if(str[i]=='P')
					{
						//出现P,开始计算A的个数。break出不是A的位置,也可能是到结束了
						for(j=i+1;j<m;j++)
						{
							if(str[j]!='A')//不为A,则可能是P或者是T.
								break;
						}
						
					}
					//如果j是结束了,没有遇到P,或者break出来是下个P的位置或者PT中间没有A。
					if((j!=0&&str[j]=='p'&&j-i==1)||j==m)
					{
						flag=false;
						break;
					}
					//如果break出来的是T的位置。且已经出现过P。不可能是j=0
					if(j!=0&&str[j]=='T')
					{
						//P的前和T的后必须都是A组成的字符串或者空。
						if(isallA(str,0,i-1)==true&&isallA(str,j+1,m)==true)
						{
							int q,p;//q表示P前面的个数乘以PT之间A的个数,q表示T后面的个数
							//i是P出现的位置,j是T的位置,m是字符串长度
							q=i*(j-i-1)+1;//因为可能是0,所以要加1.
							p=m-j;
							if(p==q&&j!=i+1)
								flag=true;
							else
								flag=false;
						//	cout<<"J:"<<j<<"  I:"<<i<<"  M:"<<m<<endl;
						//	cout<<p<<"AND"<<q<<endl;
							break;
						}
						else
						{
							flag=false;
							break;
						}
					}
					
				}
			}
			else
				flag=false;
			if(flag==false)
				cout<<"NO"<<endl;
			else
				cout<<"YES"<<endl;
			n--;
		}
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值